我正在寻找一些关于从 (La)TeX 切换到 LaTeX3 的好建议
以下是与以下玩具代码相对应的第一个问题。
使用 LaTeX3 管理可选参数的好方法是什么?
使用 LaTeX3 定义星级版本的好方法是什么?
\documentclass[12pt,a4paper]{article}
\usepackage{ifthen}
\makeatletter
\newcommand\test{\@ifstar{\@test@star}{\@test@no@star}}
\newcommand\@test@no@star[1]{%
I am a %
\ifthenelse{\equal{#1}{upper}}%
{TSAR}%
{tsar}%
.
}
\newcommand\@test@star{%
I am a star.%
}
\makeatother
\begin{document}
\test{}
\test{upper}
\test*{}
\end{document}
答案1
用 *-variant 定义命令非常简单:
\NewDocumentCommand{\test}{sm}{%
\IfBooleanTF{#1}
{% * is present
I am a star.%
}
{% no *
\testupper{#2}%
}%
}
如何定义\testupper
检查参数是否为upper
?没有“用户级版本”,您需要转到级别expl3
;建议定义自己的比较器:
\ExplSyntaxOn
\NewExpandableDocumentCommand{\comparestringTF}{mmmm}
{% #1 = input string, #2 = fixed string, #3 = true text, #4 = false text
\str_if_eq:nnTF { #1 } { #2 } { #3 } { #4 }
}
\ExplSyntaxOff
\NewDocumentCommand{\testupper}{m}{%
I am a \comparestringTF{#1}{upper}{TSAR}{tsar}%
}
在这些例子中,你可以\NewExpandableDocumentCommand
在任何地方使用,但不要太快使用它。
答案2
实际上没有“LaTeX3”,只有最新的 LaTeX2e
\documentclass{article}
\NewDocumentCommand\test{s}{\IfBooleanTF{#1}{star}{no star}}
\begin{document}
\test
\test*
\end{document}
答案3
您将需要使用xparse
自去年 10 月以来已成为 LaTeX 内核一部分的功能。您的定义变为:
\NewDocumentCommand{\test}{ s }{%
I am a
\IfBooleanTF{#1}
{TSAR}
{tsar}
}
xparse
可以通过texdoc xparse
在命令行中输入或搜索来xparse
获得完整的信息https://texdoc.org