
El siguiente código funciona bien:
\documentclass{article}
\usepackage{algpseudocode,amsmath}
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{$T(1,\dotsc,n)$}
\end{algorithmic}
\end{document}
Sin embargo, si lo reemplazo $...$
con \(...\)
, aparece un error por algún motivo. Entonces el siguiente código no funciona:
\documentclass{article}
\usepackage{algpseudocode,amsmath}
\begin{document}
\begin{algorithmic}[1]
\State \Call{MergeSort}{\(T(1,\dotsc,n)\)}
\end{algorithmic}
\end{document}
Pensé $...$
y \(...\)
son equivalentes. ¿Por qué puede estar pasando esto? Gracias.
Respuesta1
La \Call
macro utiliza \ifthenelse
, que tiene una característica muy útil: permite combinar pruebas con conectivos de lógica proposicional (llamados \AND
y \OR
) con paréntesis para indicar la precedencia. ¡Aquí está el truco! Los símbolos de estos paréntesis son \(
y \)
. Entonces, la presencia de \(
y \)
en el segundo argumento de \Call
(que se usa en una \ifthenelse{\equal{#2}{}}
prueba durante el procesamiento if \Call
) confunde a TeX, porque en el momento de esta evaluación \(
y\)
no lo sonlos delimitadores de las fórmulas matemáticas, sino los “paréntesis de lógica proposicional”.
Entonces, usa $
.
Solución 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}
Esto funciona porque xifthen
introduce una nueva \isempty
prueba que no interpreta su argumento. Por supuesto, también otras algpseudocode
macros necesitarían un tratamiento similar.