Ordenação de expansão de macro em tabelas

Ordenação de expansão de macro em tabelas

Tenho uma mesa grande (cerca de 300 entradas). Às vezes, tenho uma sequência de entradas com o mesmo valor (para uma determinada coluna). Nesse caso, preciso omitir o valor. Todos os meus valores são armazenados em variáveis ​​usadas em outros lugares e, portanto, não posso simplesmente me livrar deles. Para superar isso, criei um comando temporário para manter meu valor. Testar minha solução em texto simples me dá o resultado desejado. Porém, quando aplico minha solução em uma tabela, os resultados estão errados.

MWE (coloquei um ponto para ver melhor onde estão os 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}

No exemplo acima, fora da tabela obtive:

a . b. . .

Dentro da mesa eu tenho:

uma uma. . .

Alguém pode explicar esse comportamento?

Responder1

As células de alinhamento formam grupos, portanto a redefinição de \myvalé esquecida assim que você vai para outra célula. Use \gdef\myval{.}em vez de \renewcommand{\myval}{#1}na definição de \setMyVal. Com \renewcommandvocê só obtém uma redefinição 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}

insira a descrição da imagem aqui

informação relacionada