
Следующий код работает нормально:
\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
) с круглыми скобками для указания приоритета. Вот в чем подвох! Символы для этих скобок — \(
и \)
. Таким образом, наличие \(
и \)
во втором аргументе \Call
(который используется в \ifthenelse{\equal{#2}{}}
тесте во время обработки if \Call
) сбивает TeX с толку, потому что во время этой оценки \(
и\)
не являютсяразделители математических формул, а скорее «скобки пропозициональной логики».
Итак, используйте $
.
Альтернативное решение:
\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
макросы также нуждаются в подобной обработке.