Quando tento redefinir \\
dentro de uma tabela, minha redefinição não funciona. Eu entendi, o que provavelmente depois do gancho \AtBeginEnvironment
algo redefine meu \\
comando, mas não sei como consertar. Ajude-me por favor, como redefinir \\
dentro de uma tabela. Obrigado a todos por qualquer ajuda.
\documentclass{article}
\usepackage{expl3,etoolbox}
\ExplSyntaxOn
\AtBeginEnvironment{tabular}{
\cs_set_eq:Nc \\ {orig_endofline}
\cs_gset_protected:Npn \\ {
\orig_endofline
\message{new_line}
}
}
\ExplSyntaxOff
\author{Alexandr Kozlovskiy}
\title{test}
\begin{document}
\maketitle{}
\begin{tabular}{cc}
a&b\\
\end{tabular}
\end{document}
Responder1
É difícil...
Bem, redefinir é na verdade a parte fácil: seu código não funcionou porque uma das primeiras coisas que o tabular
ambiente faz é \let \\=\@tabularcr
, então sua redefinição acabou. Você tem que redefinir \@tabularcr
em vez disso. Lembre-se também de que \\
há um argumento opcional, então você também terá que lidar com isso. E como esse \@tabularcr
é o comando real que você deseja, você pode redefini-lo apenas uma vez, em vez de em todos os ambientes.
A parte difícil é que depois do \@tabularcr
TeX começar a procurar por \omit
, então se você fizer isso \message
neste ponto você quebrará completamente \multicolumn
. Você deve emitir o \message
(ou o que pretende fazer aqui)anteso original \@tabularcr
ou dentro \noalign
.
Você provavelmente também deseja levar em consideração o array
pacote e o tabularx
. array
undefines \@tabularcr
e usa apenas \@arraycr
, então você deve verificar isso. A redefinição vai depender se acontecer antes ou depois do carregamento do pacote, então coloquei \AtBeginDocument
para ter certeza.
O genérico \kozlovskiy_tabular_cr:Nnn
leva três argumentos:
\kozlovskiy_tabular_cr:Nnn <cr command> <star arg> <opt arg>
então acontece
\use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
Essa linha irá x
expandir tudo:
\exp_not:N
impede a expansão<cr command>
\IfValueT {#2} { * }
expande para*
ou nada, dependendo se houve uma*
discussão\IfValueT {#3} { [{#3}] }
expande para[#3]
ou nada, dependendo se houve um argumento opcional
e finalmente se tornar:
<cr command> <star arg (if present)> <opt arg (if present)>
Observe também que tabularx
o corpo do ambiente será executado várias vezes, então você pode querer:
\cs_new_protected:Npn \kozlovskiy_tabular_cr:Nnn #1 #2 #3
{
\use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
\token_if_eq_meaning:NNF \@footnotetext \TX@trial@ftn
{ \noalign { \message{<<<<new_line>>>>} } }
}
\documentclass{article}
\usepackage{expl3,xparse}
\usepackage{array,tabularx,colortbl}
\ExplSyntaxOn
\makeatletter
\cs_new_protected:Npn \kozlovskiy_tabular_cr:Nnn #1 #2 #3
{
% \message{new_line} % before or
\use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
\noalign { \message{<<<<new_line>>>>} } % after in \noalign
%
% \message{new_line} % this breaks \multicolumn
}
\AtBeginDocument
{
\@ifpackageloaded{array}{ }
{
\cs_new_eq:NN \LTX@tabularcr \@tabularcr
\RenewDocumentCommand \@tabularcr { s o }
{ \kozlovskiy_tabular_cr:Nnn \LTX@tabularcr {#1} {#2} }
}
\cs_new_eq:NN \LTX@arraycr \@arraycr
\RenewDocumentCommand \@arraycr { s o }
{ \kozlovskiy_tabular_cr:Nnn \LTX@arraycr {#1} {#2} }
}
\ExplSyntaxOff
\author{Alexandr Kozlovskiy}
\title{test}
\begin{document}
\maketitle{}
\begin{tabular}{cc}
a&b\\
\multicolumn{2}{c}{c and d}\\
\end{tabular}
\begin{tabularx}{2cm}{Xc}
a&b\\
\multicolumn{2}{c}{c and d}\\
\end{tabularx}
\end{document}