2

是否有可能有一个 TeX 命令,它将整个下一个单词(或下一个字母直到但不包括下一个标点符号)作为参数,而不仅仅是下一个字母或 {} 组?

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

4

4 回答 4

1

关于命令后的空格:参见 packagexspace和 TeX FAQ 项目Commands gobble following space

现在为什么这很困难:正如您自己指出的那样,这样的事情似乎只能通过更改 catcode 来完成。当 TeX 读取字符时,会将 Catcodes 分配给字符,而 TeX 一次读取一行,因此您不能对同一行的其他空格执行任何操作,恕我直言。可能有办法解决这个问题,但我看不到。


下面的危险代码!

这段代码只会在行尾做你想做的事,所以如果你想要的是更“流畅”的不带括号的输入,但你愿意在每个首字母缩写词后点击“return”(以后不运行任何自动缩进),你可以使用这个:

\def\caps{\begingroup\catcode`^^20 =11\mcaps}
\def\mcaps#1{\def\next##1 {\sc #1##1\catcode`^^20 =10\endgroup\ }\next}
于 2010-03-15T15:12:33.507 回答
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
于 2010-03-17T17:15:36.583 回答
1

@Debilski - 我为我的论文中的首字母缩略词写了一些类似于你的活动 * 代码的东西。我激活了 < 然后 \def<#1> 来打印首字母缩写词,以及第一次遇到的扩展名。我还通过允许在线定义扩展并使用 .aux 文件将扩展“及时”发送(如果它们在声明之前使用)或者如果是首字母缩略词则报告错误,这也有点离题了从未声明过。

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

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

于 2010-03-20T09:47:23.420 回答
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•.

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

于 2010-03-15T15:15:27.923 回答