LaTex マクロが表形式では正しく実行されない

LaTex マクロが表形式では正しく実行されない

私は使いたい大きい区切り文字(&\\)を設定する表形式の環境でマクロは、3 つの状態を持つブール スイッチとして機能するはずです。残念ながら、次のような結果が返され続けます。

ここに画像の説明を入力してくださいこれの代わりに:ここに画像の説明を入力してください

マクロは表形式環境の外ですでに試しましたが、正常に動作しています。この問題は何らかの拡張の問題が原因で発生していると思いますが、修正方法がわかりません。 または も使用してみました\DeclareRobustCommand\protect、結果は影響を受けませんでした。

私が使用したコードは次のとおりです:

\documentclass{article}
\usepackage{etoolbox}

% Define command for automatic setting of delimeters
% Usage: \setdelim{<delim1>}{<delim2>}
\newbool{startflag}
\newbool{delimflag}
\newcommand*{\setdelim}[2]{%
    \ifbool{startflag}{
        \ifbool{delimflag}{% if true
        #1
        \boolfalse{delimflag}\ignorespaces
        }{}% false is somehow not working in tabular environment}
        \notbool{delimflag}{% if false
        #2
        \booltrue{delimflag}\ignorespaces
        }{}% true is as well not working in tabular environment}
    }{%
    \setbool{startflag}{true}
    \setbool{delimflag}{true}\ignorespaces
    }
}

\begin{document}
\begin{tabular}{|l|l|}

\setdelim{init}{init} a
\setdelim{\span}{\cr} b
\setdelim{\span}{\cr} c
\setdelim{\span}{\cr} d

\end{tabular}
\end{document}

編集: このカーゴ カルト プログラミング全体の理由が何なのかまだ疑問に思っている方のために、\setdelim次のコマンド (posquit0 の awesome-cv の修正コマンド) を使用して、cv ヘッダーのオプション情報を分離します。

\newcommand*{\@headersocial}[3][unframed]{%
        \global\boolfalse{startflag}% reset startflag
        \ifthenelse{\isundefined{\@address}}%
            {}{%
            \@setdelim{##2}{##3}%
            \icon[##1]{\acvHeaderIconSize}{MapMarker}{\@address}%
        }%
        \ifthenelse{\isundefined{\@mobile}}%
            {}{%
            \@setdelim{##2}{##3}%
            \icon[##1]{\acvHeaderIconSize}{Mobile}{\@mobile}%
        }%
        \ifthenelse{\isundefined{\@email}}%
            {}{%
            \@setdelim{##2}{##3}%
            \href{mailto:\@email}{\icon[##1]{\acvHeaderIconSize}{Envelope}{\@email}}%
        }%
        \ifthenelse{\isundefined{\@homepage}}%
            {}{%
            \@setdelim{##2}{##3}%
            \href{http://\@homepage}{\icon[##1]{\acvHeaderIconSize}{Home}{\@homepage}}%
        }%
        \ifthenelse{\isundefined{\@github}}%
            {}{%
            \@setdelim{##2}{##3}%
            \href{https://github.com/\@github}{\icon[##1]{\acvHeaderIconSize}{GithubSquare}{\@github}}%
        }%
        \ifthenelse{\isundefined{\@linkedin}}%
            {}{%
            \@setdelim{##2}{##3}%
            \href{https://www.linkedin.com/in/\@linkedin}{\icon[##1]{\acvHeaderIconSize}{Linkedin}{\@linkedin}}%
        }%
        \ifthenelse{\isundefined{\@skype}}%
            {}{%
            \@setdelim{##2}{##3}%
            \icon[##1]{\acvHeaderIconSize}{Skype}{\@skype}%
        }%
        \ifthenelse{\isundefined{\@extrainfo}}%
            {}{%
            \@setdelim{##2}{##3}%
            \@extrainfo%
        }%
    }

このコマンドを使用すると、下の図に示すように、表形式の環境でヘッダーを印刷できます。

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

または、通常の区切り文字を使用して次のようにします。

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

答え1

問題は、各セルがグループを形成するため、ブール値の状態が列と行にわたって保存されないことです。 および\booltrue呼び出し\boolfalseの前に を付ける\globalと、この問題は解決します。新しい配列の場合は、ブール値を false にリセットする必要があることに注意してください。

\documentclass{article}
\usepackage{etoolbox}

% Define command for automatic setting of delimeters
% Usage: \setdelim{<delim1>}{<delim2>}
\newbool{startflag}
\newbool{delimflag}
\newcommand*{\setdelim}[2]
  {%
    \ifbool{startflag}
      {%
        \ifbool{delimflag}
          {%
            #1%
            \global\boolfalse{delimflag}%
          }
          {%
            #2%
            \global\booltrue{delimflag}%
          }%
      }
      {%
        \global\booltrue{startflag}%
        \global\booltrue{delimflag}%
      }%
    \ignorespaces
  }

\begin{document}
\begin{tabular}{|l|l|}

\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d

\end{tabular}
\end{document}

という考えのもとウルリッヒ・ディーズ引数を{init}{init}別のフラグとして使用することで、グローバル割り当てなしでも動作させることができます。以下では、各新しいセルは で開始する必要があります\setdelim。ブール値は常に次のセルが開始された後 (#1および の後#2) に設定されるため、状態は次のセルに引き継がれます。

この例では、 (2 つの引数を文字列として比較する関数に)expl3簡単にアクセスできるように、構文を使用しました。この方法では、@UlrichDiez によって提供されている両方の引数に対するかなり複雑なテストは必要ありません。このテストなしでこのテストを実行する他のソリューションももちろん可能です。 と の間のスペースは無視されるため、各行末にコメントを付ける必要がないことに注意してください。\str_if_eq:nnTFinitexpl3\ExplSyntaxOn\ExplSyntaxOff

\documentclass[]{article}

\ExplSyntaxOn
\bool_new:N \l__erdinale_setdelim_bool
\cs_new_protected:Npn \erdinale_setdelim:nn #1#2
  {
    \str_if_eq:nnTF { {#1} {#2} } { {init} {init} }
      { \bool_set_true:N \l__erdinale_setdelim_bool }
      {
        \bool_if:NTF \l__erdinale_setdelim_bool
          {
            #1
            \bool_set_false:N \l__erdinale_setdelim_bool
          }
          {
            #2
            \bool_set_true:N \l__erdinale_setdelim_bool
          }
      }
  }
\cs_new_eq:NN \setdelim \erdinale_setdelim:nn
\ExplSyntaxOff

\begin{document}
\begin{tabular}{|l|l|}
\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d
\end{tabular}

\begin{tabular}{|l|l|}
\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d
\end{tabular}
\end{document}

答え2

すべての表形式環境の本体を で開始する場合は、の最初と 2 番目の引数を連結してシーケンスを生成する\setdelim{init}{init}ケースを作成し、フラグを 1 つだけ使用して を実行できます。\setdeliminitinit

\documentclass{article}
\usepackage{etoolbox}

\makeatletter
\newcommand\CheckWhetherinitinit[1]{%
  \ifcat$\detokenize\expandafter{\gobbletoexclam#1!}$%
  \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
     % As #1 can contain & and \\ \@firstofone{...} is needed to "hide" #1 from the tabular/alignment.
  {\expandafter\@firstofone\expandafter{\forkinitinit#1!{\@firstoftwo}initinit!{\@secondoftwo}!!!}}%
  {\@secondoftwo}%
}%
\@ifdefinable\forkinitinit{\long\def\forkinitinit#1initinit!#2#3!!!{#2}}%
\@ifdefinable\gobbletoexclam{\long\def\gobbletoexclam#1!{}}%
\makeatother


% Define command for automatic setting of delimeters
% Usage: \setdelim{<delim1>}{<delim2>}
\newbool{delimflag}
\newcommand*{\setdelim}[2]{%
  \CheckWhetherinitinit{#1#2}{%
    \booltrue{delimflag}%
  }{%
    \ifbool{delimflag}{%
      #1%
      \boolfalse{delimflag}%
    }{%
      #2%
      \booltrue{delimflag}%
    }%
  }%
}%

\begin{document}

\begin{tabular}{|l|l|}
\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d
\end{tabular}

\begin{tabular}{|l|l|}
\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d
\end{tabular}

\end{document}

(正直に言うと、

\begin{tabular}{|l|l|}
\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d
\end{tabular}

かなり短い

\begin{tabular}{|l|l|}
a&b\\
c&d
\end{tabular}

は。)

関連情報