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

时间:2010-03-15 13:59:39

标签: latex tex typography

是否可以使用TeX命令将整个下一个(或下一个字母,但不包括下一个标点符号)作为参数,而不仅仅是下一个字母或{}组?

我想在某些首字母缩略词上有一个\ caps命令,但不想一遍又一遍地输入大括号。

4 个答案:

答案 0 :(得分:1)

关于命令后的空格:请参阅包xspacehttp://www.tex.ac.uk/cgi-bin/texfaq2html?label=xspace

现在为什么这是非常困难的:正如你所注意到的那样,这样的事情只能通过改变catcodes来完成。当TeX读取时,Catcodes被分配给字符,TeX一次读取一行,所以你不能对同一行上的其他空格做任何事情,恕我直言。可能有办法解决这个问题,但我没有看到它。


以下危险代码!

此代码将在行尾完成您想要的 ,所以如果您想要的更加“流畅”,不带括号输入,但您愿意在每次之后点击“返回”首字母缩略词(以后不再运行任何自动缩进),您可以使用:

\def\caps{\begingroup\catcode`^^20 =11\mcaps}
\def\mcaps#1{\def\next##1 {\sc #1##1\catcode`^^20 =10\endgroup\ }\next}

答案 1 :(得分:1)

首先创建您的命令,例如

 \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)

@Debilski - 我在论文中写了类似于你的活动*代码的缩写词。我激活了<然后\ def<#1>打印首字母缩略词,以及扩展,如果它是第一次遇到。通过允许在线定义扩展并使用.aux文件在它们被声明之前使用它们“及时”发送扩展,或者如果首字母缩略词报告错误,我也有点偏离了深层永远不会被宣布。

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

另一方面,使用XeTeX和更高的unicode字符,它可能更安全,并且通常有简单的方法来键入这些额外的字符,例如制作多(或组合)键(我通常映射numlock或其中一个窗口键),以便例如多-!-!产生¡)。或者,如果你在emacs中运行,你可以使用C- \短暂切换到TeX输入模式,通过输入TeX命令来插入unicode(虽然这对于实际输入TeX文件很麻烦,因为它会拦截你的实际\的,请不要尝试定义自己的逃脱角色!)

答案 3 :(得分:0)

一种解决方案可能是将另一个角色设置为活动并使用此角色进行转义。这不会消除对结束字符的需要,但可以避免键入\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•.

哪个应该减少对其他命令的影响,但当然需要将字符'•'映射到某个地方的键盘才能使用。