
나는매크로구분 기호( &
,\\
)테이블 형식 환경에서. 따라서 매크로는 세 가지 상태를 갖는 부울 스위치 역할을 해야 합니다. 불행히도 나는 계속해서 다음과 같은 결과를 얻습니다.
나는 이미 잘 작동하는 테이블 형식 환경 외부에서 매크로를 시도했습니다. 일부 확장 문제로 인해 문제가 발생한다고 생각하지만 해결 방법을 모르겠습니다. 또한 \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
cv 헤더에 대한 일부 선택적 정보를 분리하기 위해 다음 명령(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}
연결하는 경우를 시작 하고 하나의 플래그만 사용하여 수행할 수 있습니다.\setdelim
initinit
\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}
이다.)