LaTeX3-测试字符串相等性+Star 版本

LaTeX3-测试字符串相等性+Star 版本

我正在寻找一些关于从 (La)TeX 切换到 LaTeX3 的好建议

以下是与以下玩具代码相对应的第一个问题。

  1. 使用 LaTeX3 管理可选参数的好方法是什么?

  2. 使用 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

相关内容