
下面的程式碼工作正常:
\documentclass{article}
\usepackage{algpseudocode,amsmath}
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{$T(1,\dotsc,n)$}
\end{algorithmic}
\end{document}
但是,如果我替換$...$
為\(...\)
,由於某種原因我會收到錯誤。所以下面的程式碼不起作用:
\documentclass{article}
\usepackage{algpseudocode,amsmath}
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{\(T(1,\dotsc,n)\)}
\end{algorithmic}
\end{document}
我以為$...$
和\(...\)
是等價的。為什麼會發生這種情況?謝謝。
答案1
這個\Call
巨集使用\ifthenelse
,它有一個非常方便的功能:它允許將測試與命題邏輯連接詞(稱為\AND
和\OR
)與括號結合起來以說明優先順序。這就是問題所在!這些括號的符號是\(
和\)
。因此,\(
和 的\)
第二個參數(在處理 if 期間的測試\Call
中使用)的存在使 TeX 感到困惑,因為在評估和\ifthenelse{\equal{#2}{}}
\Call
\(
\)
不是數學公式分隔符,而是「命題邏輯括號」。
所以,使用$
.
替代解決方案:
\documentclass{article}
\usepackage{algpseudocode,amsmath,xifthen}
\algrenewcommand\Call[2]{\textproc{#1}\ifthenelse{\isempty{#2}}{}{(#2)}}%
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{\(T(1,\dotsc,n)\)}
\end{algorithmic}
\end{document}
這是有效的,因為引入了一個不解釋其參數的xifthen
新測試。\isempty
當然,其他algpseudocode
宏也需要類似的處理。