当我尝试\\
在表格中重新定义时,我的重新定义不起作用。我明白,在钩住\AtBeginEnvironment
某些东西后可能会重新定义我的\\
命令,但我不知道如何修复它。请帮助我,如何\\
在表格中重新定义。感谢大家的帮助。
\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}
答案1
这个很难(硬...
好吧,重新定义其实是最简单的部分:您的代码无法工作,因为环境tabular
所做的第一件事就是\let \\=\@tabularcr
,所以您的重新定义已经消失。您必须重新定义\@tabularcr
。还要记住\\
有一个可选参数,因此您也必须处理它。而且由于 是\@tabularcr
您想要的实际命令,因此您只需重新定义一次,而不必在每个环境中都重新定义它。
困难的部分是\@tabularcr
,之后 TeX 开始扫描\omit
,所以如果你\message
在此时这样做,你就完全崩溃了\multicolumn
。你必须发出\message
(或者你打算在这里做什么)前原来 的\@tabularcr
, 或者 里面 的\noalign
.
您可能还想考虑array
包和tabularx
。 array
未定义\@tabularcr
且仅使用\@arraycr
,因此您必须检查这一点。重新定义将取决于它是在包加载之前还是之后发生,因此我将其放在这里\AtBeginDocument
以确保万无一失。
泛型\kozlovskiy_tabular_cr:Nnn
有三个参数:
\kozlovskiy_tabular_cr:Nnn <cr command> <star arg> <opt arg>
那么它
\use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
该行将x
扩展所有内容:
\exp_not:N
阻止扩张<cr command>
\IfValueT {#2} { * }
扩展为*
或不扩展,取决于是否存在*
参数\IfValueT {#3} { [{#3}] }
扩展为[#3]
或不扩展,取决于是否有可选参数
最后变成:
<cr command> <star arg (if present)> <opt arg (if present)>
还要注意,tabularx
将多次执行环境主体,因此您可能需要:
\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}