LaTex 매크로가 테이블 형식 환경에서 제대로 실행되지 않음

LaTex 매크로가 테이블 형식 환경에서 제대로 실행되지 않음

나는매크로구분 기호( &,\\ )테이블 형식 환경에서. 따라서 매크로는 세 가지 상태를 갖는 부울 스위치 역할을 해야 합니다. 불행히도 나는 계속해서 다음과 같은 결과를 얻습니다.

여기에 이미지 설명을 입력하세요대신에:여기에 이미지 설명을 입력하세요

나는 이미 잘 작동하는 테이블 형식 환경 외부에서 매크로를 시도했습니다. 일부 확장 문제로 인해 문제가 발생한다고 생각하지만 해결 방법을 모르겠습니다. 또한 \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}

편집하다: 이 전체 카고 컬트 프로그래밍의 이유가 무엇인지 여전히 궁금해하는 분들을 위해. \setdelimcv 헤더에 대한 일부 선택적 정보를 분리하기 위해 다음 명령(posquit0의 awesome-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}

의 아이디어로@UlrichDiez인수를 {init}{init}또 다른 플래그로 사용하기 위해 전역 할당 없이 작업을 수행할 수도 있습니다. 다음에서는 각각의 새 셀이 로 시작되어야 합니다 \setdelim. 부울은 항상 다음 셀이 시작된 후( #1및 이후 #2) ​​설정되므로 상태는 다음 셀로 이어집니다.

이 예제에서는 (두 인수를 문자열로 비교하는 함수) expl3에 쉽게 액세스하기 위해 구문을 사용했습니다 . 이렇게 하면 @UlrichDiez가 제공하는 \str_if_eq:nnTF두 인수에 대해 다소 복잡한 테스트가 필요하지 않습니다 . 물론 init이 테스트를 없이 수행할 수 있는 다른 솔루션도 가능합니다. expl3사이 \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

모든 테이블 형식 환경의 본문을 로 시작하려는 경우 시퀀스를 생성하는 의 첫 번째와 두 번째 인수를 \setdelim{init}{init}연결하는 경우를 시작 하고 하나의 플래그만 사용하여 수행할 수 있습니다.\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}

이다.)

관련 정보