我发现这个非常有用的宏可以向表中添加行(同时从表外部定义行): 使用命令/宏不断向表中添加命令
就我而言,宏仅进行了一些更改,但工作正常:
\documentclass{article}
\usepackage{longtable}
\newcommand\PutLongtableRows{}
\makeatletter
\newcommand\AddLongtableRow[1]{%
\g@addto@macro\PutLongtableRows{\@gobble}%
\@for\tmp:=#1\do{%
\expandafter\g@addto@macro\expandafter\PutLongtableRows
\expandafter{\expandafter&\tmp}%
}%
\g@addto@macro\PutLongtableRows{\\*\nobreakhline}%
}
\makeatother
\begin{document}
\AddLongtableRow{5.9,5.8,R2C3,R2,3C}
\AddLongtableRow{R2C1,RCC2C2,R2C3,R2,3C}
\begin{longtable}{p{2cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}}
\caption{Blabla}
\\*\nobreakhline\nobreakhline
\PutLongTableRows
\nobreakhline
\end{longtable}
\end{document}
现在我面临逗号分隔的问题。我需要更改分隔符,因为我们的报告中的数字有逗号。因此,以下操作肯定会导致错误的表格:
\AddLongtableRow{5,9,5,8,R2C3,R2,3C}
如果我可以将分隔符 ie 更改为分号 ; 它可以像这样工作:
\AddLongtableRow{5,9;5,8;R2C3;R2;3C}
如何将逗号分隔符更改为另一个?如果我在宏中保留 &,即使删除 for 循环后它也不会起作用...感谢您的帮助(如果可能的话,不需要额外的软件包)。
答案1
这里我使用了listofitems
一个不同的解析字符来实现,这样逗号现在可以出现在表数据中。
已编辑,使行分隔符可选地指定为 的参数\AddLongtableRow
。默认值为,
但可以更改,如 MWE 的第 3 行。
\documentclass{article}
\usepackage{longtable,listofitems}
\newcommand\PutLongtableRows{}
\newcommand\nobreakhline{\hline}
\makeatletter
\newcommand\AddLongtableRow[2][,]{%
\g@addto@macro\PutLongtableRows{\@gobble}%
\setsepchar{#1}% LISTOFITEMS SEP CHAR
\readlist\z{#2}% READ THE LIST INTO \z
\foreachitem\tmp\in\z{% LISTOFITEMS DO LOOP
\expandafter\g@addto@macro\expandafter\PutLongtableRows
\expandafter{\expandafter&\tmp}%
}%
\g@addto@macro\PutLongtableRows{\\*\nobreakhline}%
}
\makeatother
\AddLongtableRow{5.9,5.8,R2C3,R2,3C}
\AddLongtableRow{R2C1,RCC2C2,R2C3,R2,3C}
\AddLongtableRow[;]{5,9;5,8;R2C3;R2;3C}
\begin{longtable}{p{2cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}}
\caption{Blabla}
\\*\nobreakhline\nobreakhline
\PutLongtableRows
\nobreakhline
\end{longtable}
\end{document}
答案2
您可以使用更简单的expl3
实现,它允许在调用时更改分隔符(默认为逗号)。
\documentclass{article}
\usepackage{longtable,colortbl}
\usepackage{xparse}
% from https://tex.stackexchange.com/a/107893/4427
\makeatletter
\def\nobreakhline{%
\noalign{\ifnum0=`}\fi
\penalty\@M
\futurelet\@let@token\LT@@nobreakhline}
\def\LT@@nobreakhline{%
\ifx\LT@next\hline
\global\let\LT@next\@gobble
\ifx\CT@drsc@\relax
\gdef\CT@LT@sep{%
\noalign{\penalty\@M\vskip\doublerulesep}}%
\else
\gdef\CT@LT@sep{%
\multispan\LT@cols{%
\CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
\fi
\else
\global\let\LT@next\empty
\gdef\CT@LT@sep{%
\noalign{\penalty\@M\vskip-\arrayrulewidth}}%
\fi
\ifnum0=`{\fi}%
\multispan\LT@cols
{\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
\CT@LT@sep
\multispan\LT@cols
{\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
\noalign{\penalty\@M}%
\LT@next}
\makeatother
\ExplSyntaxOn
\tl_new:N \g_konsens_tablerow_tl
\seq_new:N \l__konsens_tablerow_seq
\NewDocumentCommand\AddLongtableRow{O{,}m}
{
\seq_set_split:Nnn \l__konsens_tablerow_seq { #1 } { #2 }
\tl_gput_right:Nx \g_konsens_tablerow_tl
{
\seq_use:Nn \l__konsens_tablerow_seq { & }
\exp_not:n { \\*\nobreakhline} }
}
\NewDocumentCommand{\PutLongTableRows}{}
{
\tl_use:N \g_konsens_tablerow_tl
}
\ExplSyntaxOff
\begin{document}
\AddLongtableRow[;]{5,9;5,8;R2C3;R2;3C}
\AddLongtableRow{R2C1,RCC2C2,R2C3,R2,3C}
\begin{longtable}{p{2cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}}
\caption{Blabla}
\\*\nobreakhline\nobreakhline
\PutLongTableRows
\nobreakhline
\end{longtable}
\end{document}
答案3
欢迎来到 TeX.SE!以下是egreg 的回答很好(+1)。用户可见的差异是:
\PutLongTableRows
允许您选择行之间的分隔符。例如,使用\PutLongTableRows[\\]
不会在连续的行之间插入任何规则(可选参数默认为\\*\nobreakhline
,因为这似乎是您的偏好)。\PutLongTableRows
不在最后一行后附加分隔符。这样,您可以在此位置使用任何看起来最合适的东西 — “finish” 不必与两个相邻行之间的分隔符相同。
\documentclass{article}
\usepackage{longtable}
\usepackage{colortbl}
\usepackage{xparse}
% From <https://tex.stackexchange.com/a/107893/4427>
\makeatletter
\def\nobreakhline{%
\noalign{\ifnum0=`}\fi
\penalty\@M
\futurelet\@let@token\LT@@nobreakhline}
\def\LT@@nobreakhline{%
\ifx\LT@next\hline
\global\let\LT@next\@gobble
\ifx\CT@drsc@\relax
\gdef\CT@LT@sep{%
\noalign{\penalty\@M\vskip\doublerulesep}}%
\else
\gdef\CT@LT@sep{%
\multispan\LT@cols{%
\CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
\fi
\else
\global\let\LT@next\empty
\gdef\CT@LT@sep{%
\noalign{\penalty\@M\vskip-\arrayrulewidth}}%
\fi
\ifnum0=`{\fi}%
\multispan\LT@cols
{\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
\CT@LT@sep
\multispan\LT@cols
{\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
\noalign{\penalty\@M}%
\LT@next}
\makeatother
\ExplSyntaxOn
\seq_new:N \g_konsens_tablerows_seq
\seq_new:N \l__konsens_tablerow_seq
% Based on egreg's answer: <https://tex.stackexchange.com/a/527939/73317>
\NewDocumentCommand \AddLongtableRow { O{,} m }
{
\seq_set_split:Nnn \l__konsens_tablerow_seq {#1} {#2}
\seq_gput_right:Nx \g_konsens_tablerows_seq
{ \seq_use:Nn \l__konsens_tablerow_seq { & } }
}
\NewDocumentCommand \PutLongTableRows { O{\\*\nobreakhline} }
{
\seq_use:Nn \g_konsens_tablerows_seq {#1}
}
\ExplSyntaxOff
\begin{document}
\AddLongtableRow[;]{5,9;5,8;R2C3;R2;3C}
\AddLongtableRow{R2C1,RCC2C2,R2C3,R2,3C}
\begin{longtable}{p{2cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}}
\caption{Blabla}
\\*\nobreakhline\nobreakhline
\PutLongTableRows
\\*\nobreakhline
\nobreakhline
\end{longtable}
\begin{longtable}{p{2cm}|p{3cm}|p{3cm}|p{2.5cm}|p{2.5cm}}
\caption{Blabla}
\\*\nobreakhline\nobreakhline
\PutLongTableRows[\\]
\\*\nobreakhline
\nobreakhline
\end{longtable}
\end{document}