
Eu quero usar ummacropara definir os separadores ( &
, \\
)em um ambiente tabular. A macro deve, portanto, atuar como uma chave booleana com três estados. Infelizmente continuo obtendo um resultado como este:
Já tentei a macro fora do ambiente tabular onde está funcionando bem. Acredito que o problema ocorre devido a algum problema de expansão, mas não sei como consertar. Também tentei usar um \DeclareRobustCommand
ou \protect
, mas o resultado não foi afetado.
Aqui está o código que usei:
\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}
Editar:
Para aqueles que ainda estão se perguntando qual o motivo de toda essa programação de culto à carga. Eu uso \setdelim
o comando a seguir (comando modificado do awesome-cv do posquit0) para separar algumas informações opcionais para o cabeçalho 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%
}%
}
Este comando me permite imprimir um cabeçalho em ambiente tabular, conforme mostrado na figura abaixo:
Ou assim usando delimitadores regulares:
Responder1
O problema é que seus estados booleanos não serão salvos em colunas e linhas, pois cada célula forma um grupo. Prefixar as chamadas \booltrue
e com deve resolver esse problema. Lembre-se de que você terá que redefinir os booleanos como falsos para um novo array.\boolfalse
\global
\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}
Com a ideia de@UlrichDiezpara usar os argumentos {init}{init}
como outro sinalizador, também podemos fazer as coisas funcionarem sem atribuições globais. A seguir, cada nova célula deve ser iniciada com \setdelim
. Como o booleano é sempre definido após o início da próxima célula (após #1
e #2
), o estado é transferido para a próxima célula.
Usei expl3
sintaxe para este exemplo, apenas para ter acesso fácil a \str_if_eq:nnTF
(uma função que compara os dois argumentos como strings). Dessa forma, não preciso do teste bastante complicado para ambos os argumentos fornecido init
por @UlrichDiez. Outras soluções para fazer este teste expl3
são obviamente possíveis. Observe que os espaços entre \ExplSyntaxOn
e \ExplSyntaxOff
são ignorados, portanto não preciso comentar o final de cada linha.
\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}
Responder2
Se você estiver disposto a iniciar o corpo de cada ambiente tabular com \setdelim{init}{init}
, poderá iniciar o caso da concatenação do \setdelim
primeiro e segundo argumentos de ', produzindo a sequência initinit
e fazendo apenas um sinalizador.
\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}
(Para ser honesto, não sei qual é o benefício de
\begin{tabular}{|l|l|}
\setdelim{init}{init} a
\setdelim{&}{\\} b
\setdelim{&}{\\} c
\setdelim{&}{\\} d
\end{tabular}
contra o consideravelmente mais curto
\begin{tabular}{|l|l|}
a&b\\
c&d
\end{tabular}
é.)