我有以下非常基本的问题。
假设我想用 \newcommand 创建一个快捷方式,将其命名为\newcommand{\Bla}{BLA^{bla}}
。现在,如果我在文本中用附加的 来调用它^{...}
,例如,我写入\Bla^{...}
以获取输出BLA^{bla...}
,则会出现错误。
我知道为什么会出现错误,但我仍然有以下疑问:如何通过继续使用快捷方式来避免此错误?
PS:非常欢迎任何帮助或编辑,因为我几乎找不到如何给我的问题起一个实际的名字(正如标题和标签清楚显示的那样),
答案1
您的任务可以通过使用 TeX 基元以经典方式解决:
\def\Bla{\futurelet\next\Blax}
\def\Blax{\ifx^\next\afterfi{\Blay}\else\afterfi{\Blay^{}}\fi}
\def\Blay^#1{BLA^{bla#1}}
\def\afterfi#1#2\fi{\fi#1}
%test:
$\Bla, \Bla^2$
该\Bla
宏使用支持宏\Blax
和\Blay
。第二个宏定义宏的主要行为,即在^{bla}
或之后打印 BLA ^{bla<text>}
。我们假设\Bla
在数学模式下使用。将\futurelet\next\Blax
下一个标记保存到\next
并运行\Blax
。如果是,则\Blax
运行,而在其他情况下则运行。\Blay
\next
^
\Blay^{}
% suppose \Bla z:
\next is z
\Blay^{} expands to BLA^{bla} followed by z
% suppose \Bla^z:
\next is ^
\Blay^{z} expands to BLA^{blaz}.
答案2
你\NewDocumentCommand
可以使用所谓的修饰。这些是可选参数,以特定标记开头,如下所示:
\documentclass[]{article}
%\usepackage{xparse} % no longer needed with newer LaTeX versions
\NewDocumentCommand \bla { E{^}{{}} }{Bla^{bla#1}}
\begin{document}
$\bla$ and $\bla^{2}$.
\end{document}
类型参数的语法E
乍一看有点奇怪:E{<list of tokens>}{<list of defaults>}
。这就是为什么我使用E{^}{{}}
(^
将是标记,并且默认属于^
将是空)。使用两个修饰,您可以执行类似 的操作E{^_}{{}{abc}}
,这将创建两个参数,一个以^
默认为空值开始,另一个以_
默认为开始abc
。