Algorithmicx——如何使用乳胶数学分隔符

Algorithmicx——如何使用乳胶数学分隔符

今天,我决定将内联数学分隔符从使用 TeX [ $..$] 迁移到 LaTeX [ \(..\)],并且像往常一样,在环境中,我对 TeXian 胃肠病学的理解有些不稳定,因此失去了对它的理解algpseudocode

这是我的 MWE:

\documentclass{article}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithmic}[1]
\Procedure{Trigger Dispatching Scheduler}{}
\State \Call{MqOpen}{$\aleph$}
\State \Call{MqOpen}{\(\aleph\)\relax}
%\State \Call{MqOpen}{\(\aleph\)} % <== This one fails
\EndProcedure
\end{algorithmic}
\end{document}

取消注释 % 行会导致其失败(PdfLaTeXXeLaTeX)使用:

! Argument of \) has an extra }.
<inserted text> 
                \par 
l.14 \State \Call{MqOpen}{\(\aleph\)}
                                      % <== This one fails

我做错了什么?如果有人能用相当简单的术语解释这里发生了什么,我将不胜感激。

答案1

我在下面给出了答案,说这是ifthen软件包中的一个错误,但我想我会将其重新归类为特征

在未修改的\(LaTeX2e\)脆弱的命令,因此,\protect如果在移动参数中使用的话(作为的参数\equal),它们应该在前面加上。

\ifthenelse{\equal{\protect\(a\protect\)}{\protect\(a\protect\)}}{\typeout Y}{\typeout N}

确实按预期工作。

如果你加载fixltx2e核心基础发行版的软件包部分,\(那么\)强壮的所以你(甚至我)可能已经预料到这\protect是不必要的。然而,由于\ifthenelse重载\( \)语法的方式是布尔逻辑括号而不是数学开始,因此\(再次变得脆弱。下面的“修复”在本地给出了\(\)健壮的定义,但是由于在中实现的“有趣”扩展顺序,ifthenelse此本地重新定义适用于整个谓词,而不仅仅是参数,\equal因此“修复”完全是错误的,因为它完全删除了ifthenelse定义\(\)

抱歉(如果你想去掉绿色勾号我会理解:-)但除非睡一觉能让我有一个更好的想法,或者另一个贡献者有更好的想法,否则我认为我唯一能做的就是更清楚地记录ifthen如果你使用ifthen语法命令(\(\)\or\and\isodd等在\equals测试中,那么你需要\protect它们。


抱歉,这是一个错误。

\ifthenelse使用分隔符\(\)括号括住布尔表达式。这些在测试使用的字符串中是不安全的ifthenelse \equal。以下插入了一个本地定义以使事情更安全,

 \let\(\relax\let\)\relax

如果没有此行,您将会得到 MWE 中显示的相同错误。

\documentclass{article}
\usepackage{ifthen}

\makeatletter

\long\def\ifthenelse#1{%
  \toks@{#1}%
  \TE@repl\or\TE@or
  \TE@repl\and\TE@and
  \TE@repl\not\TE@neg
  \TE@repl\OR\TE@or
  \TE@repl\AND\TE@and
  \TE@repl\NOT\TE@neg
    \begingroup
        \let\protect\@unexpandable@protect
        \def\@setref##1##2##3{%
         \ifx##1\relax\z@\else\expandafter##2##1\fi}%
        \def\value##1{\the\csname c@##1\endcsname}%
        \let\equal\TE@equal \let\(\TE@lparen \let\)\TE@rparen
        \let\isodd\TE@odd \let\lengthtest\TE@length
        \let\isundefined\TE@undef
        \begingroup
          \let\@tempa\relax\let\@tempb\relax
          \let\(\relax\let\)\relax
          \xdef\@gtempa{\expandafter\TE@eval\the\toks@\TE@endeval}%
        \endgroup
        \@gtempa
        \expandafter\endgroup\ifTE@val
          \expandafter\@firstoftwo
        \else
          \expandafter\@secondoftwo
        \fi}

\makeatother


\ifthenelse{\equal{a}{a}}{\typeout Y}{\typeout N}
\ifthenelse{\equal{a}{b}}{\typeout Y}{\typeout N}
\ifthenelse{\equal{\(a\)}{\(a\)}}{\typeout Y}{\typeout N}
\ifthenelse{\equal{\(a\)}{\(b\)}}{\typeout Y}{\typeout N}


\stop


This produces

Y
N
Y
N
 )
No pages of output.

在终端上显示测试成功。

相关内容