當我嘗試\\
在表格內重新定義時,我的重新定義不起作用。我明白,在鉤子之後可能會\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
undefines\@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}