使用\@ifnextchar
一个可以检测例如下一个字符是[
,例如:
\@ifnextchar[%
{
%% code to execute if [ scanned.
}{
%% code to execute if [ scanned.
}
不过,我似乎无法用它\@ifnextchar{
来测试下一个字符是否是{
。
有什么方法可以用来\@ifnextchar
检测吗{
?
有没有什么办法可以检测{
?
如果有的话,请告诉我。
更新 1: 好吧,我认为\bgroup是一个成功的答案。我想我现在(有点)知道为什么我第一次使用它时它不起作用了。
我需要它的目的是能够拥有一个可以接受无限数量参数的宏。(例如列出作者。)一旦我们想将结果字符串放在标题中,这些似乎就会遇到问题。
更新 2: 关于我的次要问题(这是我最初的申请),有没有办法延迟TeX 中的命令。特别是,我想先运行一个宏,它等待任意数量的参数,然后对此运行第二个命令。
以下是我想做的事情:
\def\headerauth#1{\rhead{#1\ifnextchar\bgroup{\@headerauth}{.}}}
\def\@headerauth#1{\& #1\ifnextchar\bgroup{\@headerauth}{.}}}
如果没有\rhead
,一切正常。但是一旦我使用\rhead
,它只会读取第一个参数。其他的都被忽略了。例如
\headerauth{S. Mishkin}{L. Polotov}
结果是»S. 米什金。«放置在标题中,并且»L. 波洛托夫«放置在主文本中。
而如果我定义\headerauth
省略,然后\rhead
使用:
\rhead{\headerauth{S. Mishkin}{L. Polotov}}
我得到»S. Mishkin 和 L. Polotov。«在标题中根据需要。
为什么第一件事不起作用?(我意识到这个问题可能属于一个新主题……)
附言*@doncherry*&@Yossi Farjoun:我已经搞清楚了 — 原来我使用了错误的组合键来访问键盘上的 ` 符号。(根据组合键的不同,同一个键会产生 `'˚'。)(我花了一段时间才弄清楚如何通过 \` 和 \\ 引用而不使用符号 `(以及 \)— 啊,标准编码技巧。很高兴看到它非常合乎逻辑。)
答案1
\@ifnextchar\bgroup
\input
查看内核中的定义:
\def\input{\@ifnextchar\bgroup\@iinput\@@input}
其中\@iinput
能够应对\input{file}
并且\@@input
是原始的别名\input
,因此\input file
也将被处理。
\@ifnextchar
有三个参数:(1) 要查找的标记,(2) 如果找到该标记,该怎么做,(3) 如果不存在该标记,该怎么做。存储参数后,它使 TeX 查找以下内容令牌(不是参数)并将其(与\ifx
)与存储的第一个参数进行比较。如果是,则#1
由于\bgroup
内核中给出的语句,它成功地与左括号进行了比较
\let\bgroup={
这并不意味着 总是\bgroup
可以用作开括号的替代品;它只在某些特殊情况下才允许用于此目的。例如,在minipage
或的定义中就利用了这一点lrbox
。为了进行比较,\bgroup
是 的正确替代品{
,因为 TeX 可以将其视为宏的参数。
\xyz
假设我们想在宏后面跟着一个左括号或不跟着一个左括号时做一些不同的事情;假设我们想支持语法
\xyz{abc}
\xyz abc\stopxyz
使用abc
作为参数。然后我们会做
\newcommand{\xyz}{\@ifnextchar\bgroup\@xyzb\@xyz}
\def\@xyz#1\stopxyz{\@xyzb{#1}}
\def\@xyzb#1{do something with #1}
这也可以用于定义具有“未知”数量参数的宏,比如说标题中的作者列表:
\def\authorslist{\ignorespaces} % initialization
\def\authors#1{\g@addto@macro\authorslist{ #1}\@ifnextchar\bgroup\authors{}}
\fancyhead[R]{\authorslist}
宏\authors
将其参数附加到列表中(初始化以忽略第一个作者之前的空格),然后再次执行,直到不再有括号(当它不执行任何操作时)。