ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* Automated Quotation/Punctuation Placement
@ 2010-01-08 16:27 Tad Ashlock
  2010-01-08 16:51 ` Wolfgang Schuster
  2010-01-08 17:01 ` Khaled Hosny
  0 siblings, 2 replies; 5+ messages in thread
From: Tad Ashlock @ 2010-01-08 16:27 UTC (permalink / raw)
  To: ntg-context

Hi All,

I'm trying to create a command that will apply a consistent style to a 
word or phrase.  For example, when documenting source code, I'd like to 
be able to mark variables with \Var{var_name}.  Then if I want the 
variable names to be in mono, I can \def\Var#1{\type{#1}}.  No problem 
there.  If I want variable names to be in quotes, then 
\def\Var#1{\quote{#1}}.

The problem is that in my ConTeXt code I'd write "This is 
\Var{var_name}, a variable."  Which would get typeset as "This is 
'var_name', a variable." where punctuation convention (at least in 
American English) would have the comma inside the quote like this: "This 
is 'var_name,' a variable."

I've tried four different ways of implementing this, but none of them 
work consistently.  Here's my last attempt:

==========================
\startluacode
function move_end_punctuation (text, punc, cmd_start, cmd_mid, cmd_end)
    context(cmd_start .. text .. cmd_mid)
    if string.find('.,!?', punc, 1, true) then
        context(punc .. cmd_end)
    else
        context(cmd_end .. ' ' .. punc)
    end
end
\stopluacode

\def\Var#1#2{\ctxlua{move_end_punctuation([==[#1]==],[==[#2]==],
    '\\quote{\\type{','}','}')}}

\starttext

This is \Var{var_name}, a variable.

\stoptext
==========================

This works, until the \Var{} macro appears in the argument of another 
macro.  For example, make the text:

\framed{This is \Var{var_name}, a variable.}

and the following error results:
==========================
systems         : begin file test.tex at line 16
! Missing $ inserted.
<inserted text>
                $
<to be read again>
                   _
l.1 ...spaces quote{unskip  ignorespaces type{var_
                                                  name}
\Var ...=],[==[#2]==], '\\quote{\\type{','}','}')}
                                                 
l.18 \framed{This is \Var{var_name},
                                     a variable.}
?
==========================

I think my problem has to do with parameter expansion, but I don't 
understand the intricacies enough to solve this.  I flailed away, 
unsuccessfully, with various combinations of \unexpanded, 
\normalunexpanded, luaescapestring, etc.

Does anyone have a solution or a pointer in the right direction?

Thank you,
Tad



___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Automated Quotation/Punctuation Placement
  2010-01-08 16:27 Automated Quotation/Punctuation Placement Tad Ashlock
@ 2010-01-08 16:51 ` Wolfgang Schuster
  2010-01-08 21:30   ` Tad Ashlock
  2010-01-08 17:01 ` Khaled Hosny
  1 sibling, 1 reply; 5+ messages in thread
From: Wolfgang Schuster @ 2010-01-08 16:51 UTC (permalink / raw)
  To: mailing list for ConTeXt users


Am 08.01.2010 um 17:27 schrieb Tad Ashlock:

> Hi All,
> 
> I'm trying to create a command that will apply a consistent style to a word or phrase.  For example, when documenting source code, I'd like to be able to mark variables with \Var{var_name}.  Then if I want the variable names to be in mono, I can \def\Var#1{\type{#1}}.  No problem there.  If I want variable names to be in quotes, then \def\Var#1{\quote{#1}}.
> 
> The problem is that in my ConTeXt code I'd write "This is \Var{var_name}, a variable."  Which would get typeset as "This is 'var_name', a variable." where punctuation convention (at least in American English) would have the comma inside the quote like this: "This is 'var_name,' a variable."
> 
> I've tried four different ways of implementing this, but none of them work consistently.  Here's my last attempt:
> 
> ==========================
> \startluacode
> function move_end_punctuation (text, punc, cmd_start, cmd_mid, cmd_end)
>   context(cmd_start .. text .. cmd_mid)
>   if string.find('.,!?', punc, 1, true) then
>       context(punc .. cmd_end)
>   else
>       context(cmd_end .. ' ' .. punc)
>   end
> end
> \stopluacode
> 
> \def\Var#1#2{\ctxlua{move_end_punctuation([==[#1]==],[==[#2]==],
>   '\\quote{\\type{','}','}')}}
> 
> \starttext
> 
> This is \Var{var_name}, a variable.
> 
> \stoptext
> ==========================
> 
> This works, until the \Var{} macro appears in the argument of another macro.  For example, make the text:
> 
> \framed{This is \Var{var_name}, a variable.}
> 
> and the following error results:
> ==========================
> systems         : begin file test.tex at line 16
> ! Missing $ inserted.
> <inserted text>
>               $
> <to be read again>
>                  _
> l.1 ...spaces quote{unskip  ignorespaces type{var_
>                                                 name}
> \Var ...=],[==[#2]==], '\\quote{\\type{','}','}')}
>                                                l.18 \framed{This is \Var{var_name},
>                                    a variable.}
> ?
> ==========================
> 
> I think my problem has to do with parameter expansion, but I don't understand the intricacies enough to solve this.  I flailed away, unsuccessfully, with various combinations of \unexpanded, \normalunexpanded, luaescapestring, etc.
> 
> Does anyone have a solution or a pointer in the right direction?

\nonknuthmode % make '_' a normal character in text mode

\define[1]\Var
  {\doifnextcharelse{,}{\doVar{#1,}\gobbleoneargument}{\noVar{#1}}}

\define[1]\doVar
  {\mono{#1}}

\define[1]\noVar
  {\mono{#1}%
   \doifnextcharelse{;} % \autoinsertnextspace is no longer available in MkIV :(
     {\donothing}
     {\doifnextcharelse{.}
        {\donothing}
        {\space}}}

\starttext

This is \Var{var_name}, a variable.

This is \Var{var_name,} a variable.

\framed{This is \Var{var_name}, a variable.}

\stoptext

Wolfgang

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Automated Quotation/Punctuation Placement
  2010-01-08 16:27 Automated Quotation/Punctuation Placement Tad Ashlock
  2010-01-08 16:51 ` Wolfgang Schuster
@ 2010-01-08 17:01 ` Khaled Hosny
  2010-01-08 21:50   ` Tad Ashlock
  1 sibling, 1 reply; 5+ messages in thread
From: Khaled Hosny @ 2010-01-08 17:01 UTC (permalink / raw)
  To: mailing list for ConTeXt users


[-- Attachment #1.1: Type: text/plain, Size: 3277 bytes --]

What about:

\def\Var#1#2{'\type{#1}%
\directlua{
if "#2" == "," then
  tex.sprint("#2'")
else
  tex.sprint("'#2")
end}}

\Var{555}, hello \Var{666}. \Var{666}\par


On Fri, Jan 08, 2010 at 09:27:37AM -0700, Tad Ashlock wrote:
> Hi All,
> 
> I'm trying to create a command that will apply a consistent style to
> a word or phrase.  For example, when documenting source code, I'd
> like to be able to mark variables with \Var{var_name}.  Then if I
> want the variable names to be in mono, I can \def\Var#1{\type{#1}}.
> No problem there.  If I want variable names to be in quotes, then
> \def\Var#1{\quote{#1}}.
> 
> The problem is that in my ConTeXt code I'd write "This is
> \Var{var_name}, a variable."  Which would get typeset as "This is
> 'var_name', a variable." where punctuation convention (at least in
> American English) would have the comma inside the quote like this:
> "This is 'var_name,' a variable."
> 
> I've tried four different ways of implementing this, but none of
> them work consistently.  Here's my last attempt:
> 
> ==========================
> \startluacode
> function move_end_punctuation (text, punc, cmd_start, cmd_mid, cmd_end)
>    context(cmd_start .. text .. cmd_mid)
>    if string.find('.,!?', punc, 1, true) then
>        context(punc .. cmd_end)
>    else
>        context(cmd_end .. ' ' .. punc)
>    end
> end
> \stopluacode
> 
> \def\Var#1#2{\ctxlua{move_end_punctuation([==[#1]==],[==[#2]==],
>    '\\quote{\\type{','}','}')}}
> 
> \starttext
> 
> This is \Var{var_name}, a variable.
> 
> \stoptext
> ==========================
> 
> This works, until the \Var{} macro appears in the argument of
> another macro.  For example, make the text:
> 
> \framed{This is \Var{var_name}, a variable.}
> 
> and the following error results:
> ==========================
> systems         : begin file test.tex at line 16
> ! Missing $ inserted.
> <inserted text>
>                $
> <to be read again>
>                   _
> l.1 ...spaces quote{unskip  ignorespaces type{var_
>                                                  name}
> \Var ...=],[==[#2]==], '\\quote{\\type{','}','}')}
> l.18 \framed{This is \Var{var_name},
>                                     a variable.}
> ?
> ==========================
> 
> I think my problem has to do with parameter expansion, but I don't
> understand the intricacies enough to solve this.  I flailed away,
> unsuccessfully, with various combinations of \unexpanded,
> \normalunexpanded, luaescapestring, etc.
> 
> Does anyone have a solution or a pointer in the right direction?
> 
> Thank you,
> Tad
> 
> 
> 
> ___________________________________________________________________________________
> If your question is of interest to others as well, please add an entry to the Wiki!
> 
> maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
> webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
> archive  : http://foundry.supelec.fr/projects/contextrev/
> wiki     : http://contextgarden.net
> ___________________________________________________________________________________

-- 
 Khaled Hosny
 Arabic localiser and member of Arabeyes.org team
 Free font developer

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 197 bytes --]

[-- Attachment #2: Type: text/plain, Size: 486 bytes --]

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Automated Quotation/Punctuation Placement
  2010-01-08 16:51 ` Wolfgang Schuster
@ 2010-01-08 21:30   ` Tad Ashlock
  0 siblings, 0 replies; 5+ messages in thread
From: Tad Ashlock @ 2010-01-08 21:30 UTC (permalink / raw)
  To: mailing list for ConTeXt users

Wolfgang Schuster wrote:
> Am 08.01.2010 um 17:27 schrieb Tad Ashlock:Hi All,
>>
>> ========================
>> \startluacode
>> function move_end_punctuation (text, punc, cmd_start, cmd_mid, cmd_end)
>>   context(cmd_start .. text .. cmd_mid)
>>   if string.find('.,!?', punc, 1, true) then
>>       context(punc .. cmd_end)
>>   else
>>       context(cmd_end .. ' ' .. punc)
>>   end
>> end
>> \stopluacode
>>
>> \def\Var#1#2{\ctxlua{move_end_punctuation([=#1]==],[==[#2]==],
>>   '\\quote{\\type{','}','}')}}
>>
>> \starttext
>>
>> This is \Var{var_name}, a variable.
>>
>> \stoptext
>> ========================
>>
>> This works, until the \Var{} macro appears in the argument of another macro.  For example, make the text:
>>
>> \framed{This is \Var{var_name}, a variable.}
>
> \nonknuthmode % make '_' a normal character in text mode
>
> \define[1]\Var
>   {\doifnextcharelse{,}{\doVar{#1,}\gobbleoneargument}{\noVar{#1}}}
>
> \define[1]\doVar
>   {\mono{#1}}
>
> \define[1]\noVar
>   {\mono{#1}%
>    \doifnextcharelse{;} % \autoinsertnextspace is no longer available in MkIV :(
>      {\donothing}
>      {\doifnextcharelse{.}
>         {\donothing}
>         {\space}}}
>
> \starttext
>
> This is \Var{var_name}, a variable.
>
> This is \Var{var_name,} a variable.
>
> \framed{This is \Var{var_name}, a variable.}
>
> \stoptext
>
> Wolfgang


Thanks for responding Wolfgang.  But this solution has some problems.

The first problem is that it only works for commas.  I'm sure I can 
figure out how to next the \doifnextcharelse commands to add periods, 
question marks, and exclamation points, but then the command becomes 
rather unwieldy.  Not really a problem for a single command, but this 
leads to...

Problem number 2 is that I'm going to need many of these commands for 
different types of things.  I'd like to abstract out the "punctuation 
swapping" so that it doesn't have to be repeated for each command.

But the show-stopper is problem number 3: this solution still breaks in 
other places, like captions:

========================
\starttext
\placefigure
[left]
{This is \Var{var_name}, a variable.}
{\framed{And \Var{another_var_name} is yet another variable.}}
\stoptext
========================

results in:

========================
> ! Argument of \gobbleoneargument has an extra }.
> <inserted text>
>                 \par
> <to be read again>
>                    }
> \doifnextcharelse ...token =#1\def \!!stringa {#2}
>                                                   \def \!!stringb 
> {#3}\futur...
> \@@kjfiguretitle ->This is \Var {var_name}
>                                           , a variable.
> \doif #1#2->\edef \!!stringa {#1
>                                 }\edef \!!stringb {#2}\ifx \!!stringa 
> \!!str...
> \dostructurecountercomponent ...\c!title }\v!none
>                                                   {\setfalse 
> \hasstructureco...
> ...
> l.47 ...other_var_name} is yet another variable.}}
>                                                  
> ?
========================

This is the sort of problem I was flailing around with.  I'd get a 
definition that worked in one case, but broke in another.  One attempt 
broke when I included a table of contents.

Thanks again!
Tad
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Automated Quotation/Punctuation Placement
  2010-01-08 17:01 ` Khaled Hosny
@ 2010-01-08 21:50   ` Tad Ashlock
  0 siblings, 0 replies; 5+ messages in thread
From: Tad Ashlock @ 2010-01-08 21:50 UTC (permalink / raw)
  To: mailing list for ConTeXt users

Khaled Hosny wrote:
> On Fri, Jan 08, 2010 at 09:27:37AM -0700, Tad Ashlock wrote:
>>
>> ==========================
>> \startluacode
>> function move_end_punctuation (text, punc, cmd_start, cmd_mid, cmd_end)
>>    context(cmd_start .. text .. cmd_mid)
>>    if string.find('.,!?', punc, 1, true) then
>>        context(punc .. cmd_end)
>>    else
>>        context(cmd_end .. ' ' .. punc)
>>    end
>> end
>> \stopluacode
>>
>> \def\Var#1#2{\ctxlua{move_end_punctuation([==[#1]==],[==[#2]==],
>>    '\\quote{\\type{','}','}')}}
>>
>> \starttext
>>
>> This is \Var{var_name}, a variable.
>>
>> \stoptext
>> ==========================
> What about:
>
>
> \def\Var#1#2{'\type{#1}%
> \directlua{
> if "#2" == "," then
>   tex.sprint("#2'")
> else
>   tex.sprint("'#2")
> end}}
>
>
> \Var{555}, hello \Var{666}. \Var{666}\par
>


Thank you, Khaled, for the response.  This solution works as is.  But it 
has a problem as soon as you want to put double quotes around the 
variable name.

Simply replacing the single quotes with double quotes in your solution 
doesn't produce open- and close-quotes pairs:

==================
\def\Var#1#2{"\type{#1}%
\directlua{
if "#2" == "," then
  tex.sprint('#2"')
else
  tex.sprint('"#2')
end}}
==================

In order to do that, you need (I think) to use the \quotation{} command:

==================
\def\Var#1#2{\quotation{\type{#1}%
\directlua{
if "#2" == "," then
  tex.sprint("#2}")
else
  tex.sprint("}#2")
end}}
==================

resulting in:

==================
! Too many }'s.
l.7 end}}
==================

I also tried \bgroup...\egroup:

==================
\def\Var#1#2{\quotation\bgroup\type{#1}%
\directlua{
if "#2" == "," then
  tex.sprint("#2\egroup ")
else
  tex.sprint("\egroup #2")
end}}
==================

giving:

==================
! Missing } inserted.
<inserted text>
                }
<to be read again>
                   \normalend
l.18 \stoptext
==================

Thanks again!
Tad

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-01-08 21:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-08 16:27 Automated Quotation/Punctuation Placement Tad Ashlock
2010-01-08 16:51 ` Wolfgang Schuster
2010-01-08 21:30   ` Tad Ashlock
2010-01-08 17:01 ` Khaled Hosny
2010-01-08 21:50   ` Tad Ashlock

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).