Orden de expansión de macros en tablas

Orden de expansión de macros en tablas

Tengo una mesa grande (alrededor de 300 entradas). A veces, tengo una secuencia de entradas con el mismo valor (para una columna determinada). En tal caso, necesito omitir el valor. Todos mis valores se almacenan en variables utilizadas en otros lugares y, por lo tanto, no puedo simplemente deshacerme de ellos. Para superar eso, creé un comando temporal para mantener mi valor. Probar mi solución en texto plano me da el resultado deseado. Sin embargo, cuando aplico mi solución en una tabla, los resultados son incorrectos.

MWE (le pongo un punto para ver mejor donde están los valores omitidos):

\documentclass{article}
\usepackage{ifthen}

\begin{document}

\newcommand{\myval}{}

\newcommand{\setMyVal}[1]{\renewcommand{\myval}{#1}}

\newcommand{\printOnlyFirstOccurence}[1]{
    \ifthenelse{\equal{\myval}{#1}}
        {.}
        {\setMyVal{#1}\myval}%else
}

Outside table:

\printOnlyFirstOccurence{a}

\printOnlyFirstOccurence{a}

\printOnlyFirstOccurence{b}

\printOnlyFirstOccurence{b}

\printOnlyFirstOccurence{b}



Behaviour inside table:

\begin{table}[h!]
\centering
\begin{tabular}{c|c} \hline
    \printOnlyFirstOccurence{a} & a \\ \hline
    \printOnlyFirstOccurence{a} & a \\ \hline
    \printOnlyFirstOccurence{b} & b \\ \hline
    \printOnlyFirstOccurence{b} & b \\ \hline
    \printOnlyFirstOccurence{b} & b \\ \hline
\end{tabular}

\end{table}

\end{document}

En el ejemplo anterior, fuera de la tabla obtuve:

a . b . . .

Dentro de la mesa tengo:

un un. . .

¿Alguien puede explicar este comportamiento?

Respuesta1

Las celdas de alineación forman grupos, por lo que la redefinición de \myvalse olvida tan pronto como se pasa a otra celda. Úselo \gdef\myval{.}en lugar de \renewcommand{\myval}{#1}en la definición de \setMyVal. Con \renewcommandsolo obtienes una redefinición local.

\documentclass{article}
\usepackage{ifthen}

\begin{document}

\newcommand{\myval}{}

\newcommand{\setMyVal}[1]{\gdef\myval{#1}}

\newcommand{\printOnlyFirstOccurence}[1]{
    \ifthenelse{\equal{\myval}{#1}}
        {.}
        {\setMyVal{#1}\myval}%else
}

Outside table:

\printOnlyFirstOccurence{a}

\printOnlyFirstOccurence{a}

\printOnlyFirstOccurence{b}

\printOnlyFirstOccurence{b}

\printOnlyFirstOccurence{b}



Behaviour inside table:

\begin{table}[h!]
\centering
\begin{tabular}{c|c} \hline
    \printOnlyFirstOccurence{a} & a \\ \hline
    \printOnlyFirstOccurence{a} & a \\ \hline
    \printOnlyFirstOccurence{b} & b \\ \hline
    \printOnlyFirstOccurence{b} & b \\ \hline
    \printOnlyFirstOccurence{b} & b \\ \hline
\end{tabular}

\end{table}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada