Режим LaTeX Math в алгоритмической среде

Режим LaTeX Math в алгоритмической среде

Следующий код работает нормально:

\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макросы также нуждаются в подобной обработке.

Связанный контент