Порядок макрорасширения в таблицах

Порядок макрорасширения в таблицах

У меня большая таблица (около 300 записей). Иногда у меня есть последовательность записей с одним и тем же значением (для заданного столбца). В таком случае мне нужно опустить значение. Все мои значения хранятся в переменных, используемых в другом месте, и поэтому я не могу просто избавиться от них. Чтобы преодолеть это, я создал временную команду для сохранения моего значения. Тестирование моего решения в виде простого текста дает мне желаемый результат. Однако, когда я применяю свое решение в таблице, результаты оказываются неверными.

MWE (я поставил точку, чтобы лучше видеть, где пропущены значения):

\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}

В приведенном выше примере за пределами таблицы я получил:

а . б . . .

Внутри таблицы я получил:

а а . . .

Может ли кто-нибудь объяснить такое поведение?

решение1

Ячейки выравнивания образуют группы, поэтому переопределение \myvalзабывается, как только вы переходите к другой ячейке. Используйте \gdef\myval{.}вместо \renewcommand{\myval}{#1}в определении \setMyVal. С \renewcommandвы получите только локальное переопределение.

\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}

введите описание изображения здесь

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