有没有办法在( )\(...\)
中的任何命令的参数中使用较新的数学语法?文档和几乎所有其他教程都使用 TeX-primitive 。algpseudocode
algorithmicx
$...$
梅威瑟:
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithm}
\begin{algorithmic}
\For{\(i \gets 0\) to \(n\)} % breaks
\State \Call{Foo}{\(i\)} % breaks
\EndFor
\end{algorithmic}
\end{algorithm}
\end{document}
答案1
我没有收到来自 的错误\For{\(i \gets 0\) to \(n\)}
。但是来自 的错误\Call{Foo}{\(i\)}
因为\Call
最终变成了
#1#2->\textproc {#1}\ifthenelse {\equal {#2}{}}{}{(#2)}
\equal{#2}
当传递包含 LaTeX 强命令的内容时会失败,因为它尝试进行完全扩展。
你可以修复这个问题。
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\algrenewcommand\Call[2]{%
\textproc{#1}%
\ifthenelse{\equal{\detokenize{#2}}{}}{}{(#2)}%
}
\begin{document}
\begin{algorithm}
\begin{algorithmic}
\For{\(i \gets 0\) to \(n\)}
\State \Call{Foo}{\(i\)}
\EndFor
\end{algorithmic}
\end{algorithm}
\end{document}
或者更有效地,
\algrenewcommand\Call[2]{%
\textproc{#1}%
\if\relax\detokenize{#2}\relax\else(#2)\fi
}
还有其他两个地方可能需要这样的修复,因此应该有一个完整的版本
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
%%% fix for usage of \ifthenelse
\newcommand{\algparenthesize}[1]{%
\if\relax\detokenize{#1}\relax\else(#1)\fi
}
\algdef{SE}[PROCEDURE]{Procedure}{EndProcedure}[2]
{\algorithmicprocedure\ \textproc{#1}\algparenthesize{#2}}
{\algorithmicend\ \algorithmicprocedure}
\algdef{SE}[FUNCTION]{Function}{EndFunction}[2]
{\algorithmicfunction\ \textproc{#1}\algparenthesize{#2}}
{\algorithmicend\ \algorithmicfunction}
\algrenewcommand\Call[2]{\textproc{#1}\algparenthesize{#2}}
%%% end fix
\begin{document}
\begin{algorithm}
\begin{algorithmic}
\For{\(i \gets 0\) to \(n\)}
\State \Call{Foo}{\(i\)}
\EndFor
\end{algorithmic}
\end{algorithm}
\end{document}