今天,我决定将内联数学分隔符从使用 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}
取消注释 % 行会导致其失败(PdfLaTeX和XeLaTeX)使用:
! 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.
在终端上显示测试成功。