
O código a seguir funciona bem:
\documentclass{article}
\usepackage{algpseudocode,amsmath}
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{$T(1,\dotsc,n)$}
\end{algorithmic}
\end{document}
No entanto, se eu substituir $...$
por \(...\)
, recebo um erro por algum motivo. Portanto o código a seguir não funciona:
\documentclass{article}
\usepackage{algpseudocode,amsmath}
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{\(T(1,\dotsc,n)\)}
\end{algorithmic}
\end{document}
Eu pensei $...$
e \(...\)
são equivalentes. Por que isso pode estar acontecendo? Obrigado.
Responder1
A \Call
macro utiliza \ifthenelse
, que possui um recurso muito útil: permite combinar testes com conectivos lógicos proposicionais (chamados \AND
e \OR
) com parênteses para indicar a precedência. Aqui está o problema! Os símbolos para esses parênteses são \(
e \)
. Portanto, a presença de \(
e \)
no segundo argumento de \Call
(que é usado em um \ifthenelse{\equal{#2}{}}
teste durante o processamento if \Call
) confunde o TeX, porque no momento desta avaliação \(
e\)
não sãoos delimitadores das fórmulas matemáticas, mas sim os “parênteses lógicos proposicionais”.
Então, use $
.
Solução alternativa:
\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}
Isso funciona porque xifthen
introduz um novo \isempty
teste que não interpreta seu argumento. É claro que outras algpseudocode
macros também precisariam de tratamento semelhante.