代码之家  ›  专栏  ›  技术社区  ›  Debilski

影响下一个完整单词的tex命令

  •  2
  • Debilski  · 技术社区  · 15 年前

    有没有可能有一个tex命令来执行下一个 单词 (或者下一个字母到但不包括下一个标点符号)作为参数,而不仅仅是下一个字母或{}组?

    我想对某些首字母缩略词使用一个\caps命令,但不想一遍又一遍地键入花括号。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Alexey Malistov    15 年前

    首先创建命令,例如

     \def\capsimpl#1{{\sc #1}}% Your main macro
    

    捕捉空格或标点符号的解决方案:

    \catcode`\@=11  
    \def\addtopunct#1{\expandafter\let\csname punct@\meaning#1\endcsname\let} 
    \addtopunct{ }
    \addtopunct{.}    \addtopunct{,}    \addtopunct{?} 
    \addtopunct{!}    \addtopunct{;}    \addtopunct{:} 
    
    \newtoks\capsarg
    \def\caps{\capsarg{}\futurelet\punctlet\capsx}
    \def\capsx{\expandafter\ifx\csname punct@\meaning\punctlet\endcsname\let
           \expandafter\capsend  
           \else \expandafter\continuecaps\fi}
    
    \def\capsend{\expandafter\capsimpl\expandafter{\the\capsarg}}
    \def\continuecaps#1{\capsarg=\expandafter{\the\capsarg#1}\futurelet\punctlet\capsx}
    
    \catcode`\@=12
    
        2
  •  1
  •   AVB    15 年前

    关于命令后的空白:请参见包 xspace , http://www.tex.ac.uk/cgi-bin/texfaq2html?label=xspace

    现在为什么这是非常困难的:正如你自己所说,这样的事情似乎只能通过改变catcode来完成。当tex读取字符时,catcode被分配给字符,tex一次读取一行,因此不能对同一行上的其他空格做任何操作,imho。也许有办法,但我看不出来。


    下面是危险代码!

    这段代码可以做你想做的 只有 在行尾,如果您想要的是更“流畅”的无括号键入,但您愿意在每个首字母缩略词后单击“return”(以后不运行任何自动缩进),则可以使用:

    \def\caps{\begingroup\catcode`^^20 =11\mcaps}
    \def\mcaps#1{\def\next##1 {\sc #1##1\catcode`^^20 =10\endgroup\ }\next}
    
        3
  •  1
  •   Steve    15 年前

    @Debilski-我在论文中为缩略词写了一些类似于你的active*代码的东西。我激活了<然后单击了\def<>1>来打印首字母缩略词,如果这是第一次遇到扩展,也会打印扩展名。我还做了一些深入的工作,允许在行中定义扩展,如果在声明之前使用了扩展,则使用.aux文件“及时”发送它们,或者如果从未声明缩写,则报告错误。

    总的来说,当时这似乎是个好主意-我很少需要在实际文本中使用catcode 12(因为我的所有宏都在一个单独的.sty文件中),而且我让它在数学模式下运行,所以我无法预见任何困难。但孩子,它是脆弱的…我不知道有多少次,我不小心改变了一些看似无关的东西,把我的身材弄坏了。这么说来,就是 非常 小心激活那些甚至是远程常用的字符。

    另一方面,使用xetex和更高的unicode字符,可能会更安全,而且通常有一些简单的方法来键入这些额外的字符,例如生成一个multi(或compose)键(我通常会将numlock或一个windows键映射到这个键),这样,例如multi-!-!生产)。或者,如果您在Emacs中运行,您可以使用c-\切换到tex输入模式,通过为其键入tex命令来简单地插入Unicode(尽管这对于实际键入tex文档是一种痛苦,因为它会截获您的实际文档,请不要尝试定义您自己的转义字符!)

        4
  •  0
  •   Debilski    15 年前

    一种解决方案可能是将另一个字符设置为活动字符并使用此字符进行转义。这不会消除对结束字符的需要,但避免键入 \caps 宏,因此整体上更容易键入。

    因此,在非常特殊的情况下,下面的工作。

    \catcode`\*=\active
    \def*#1*{\textsc{\MakeTextLowercase{#1}}}
    
    Now follows an *Acronym*.
    

    不幸的是,这使得 \section*{} 没有额外的宏定义是不可能的。

    在xetex中,似乎可以利用unicode字符来实现这一点,因此可以定义

    \catcode`\•=\active
    \def•#1•{\textsc{\MakeTextLowercase{#1}}}
    
    Now follows an •Acronym•.
    

    这应该会减少对其他命令的影响,但当然需要将字符映射到键盘的某个位置以供使用。