テーブル内のマクロ展開順序

テーブル内のマクロ展開順序

大きなテーブル (約 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}

上記の例では、テーブルの外側に次の内容が表示されました。

a . b . . .

テーブルの中には次のものが入っていました:

あああ。

誰かこの動作を説明できますか?

答え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}

ここに画像の説明を入力してください

関連情報