更改 tex 代码/for 循环中的分隔符

更改 tex 代码/for 循环中的分隔符

我发现这个非常有用的宏可以向表中添加行(同时从表外部定义行): 使用命令/宏不断向表中添加命令

就我而言,宏仅进行了一些更改,但工作正常:

\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}

在此处输入图片描述

相关内容