使用 csvsimple、siunitx 和 tokcycle 包为表格创建粗体标题

使用 csvsimple、siunitx 和 tokcycle 包为表格创建粗体标题

我发现这个帖子,说明如何用粗体字样排版表格标题。只要我不使用包格式化数字,将它与包\csvreader中的结合就可以了。下面修复了两个小数点,如下所示csvsimplesiunitx\sisetup这个答案

\documentclass{article}
\usepackage{csvsimple, siunitx, booktabs, array}

\begin{filecontents*}{sample.csv}
Player, Merlin, Mordred
Andrew, 0.6, 0.55
Ben, 0.54, 0.62
\end{filecontents*}

\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{-}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}#1\ignorespaces}

\csvstyle{boldhead}{
    no head,
    table head=\toprule\rowstyle{\bfseries},
    late after first line=\\ \midrule, 
    table foot=\bottomrule
}
\sisetup{round-mode=places, round-precision=2, round-integer-to-decimal}

\begin{document}

\csvreader[tabular=+l-c-c, boldhead]{sample.csv}{}{\csvcoli & \csvcolii & \csvcoliii}

\end{document}

我认为这个解决方案存在三个问题:

  1. head to column names由于选项已加载,因此无法使用该选项no head。有没有更好的方法使用来显示标题,\csvreader同时保留使用的可能性 head to column names
  2. 如果我tabular=+l-c-c用替换tabular=+l-S-S,那么表格将不再排版,因为siunitx包无法识别标题并抛出错误invalid numerical input 'e'
  3. 就我个人而言,我更喜欢输入lcc而不是+l-c-c

由于包的数字格式siunitx可以用组进行转义,因此我对第 2 点的想法是将一\bgroup \egroup对包含到行样式中,如下所示:

\newcolumntype{+}{>{\global\let\currentrowstyle\relax\global\let\currentrowstylepost\relax}}
\newcolumntype{-}{>{\currentrowstyle}}
\newcolumntype{^}{<{\currentrowstylepost}}
\newcommand{\rowstyle}[1]{%
    \gdef\currentrowstylepost{\egroup}%
    \gdef\currentrowstyle{#1\bgroup}%
    #1\bgroup\ignorespaces%
}

虽然上述代码适用于 option tabular=+l^-c^-c^,但对于 仍然不起作用tabular=+l^-S^-S^。我遗漏了什么?

关于第 3 点,有人可能会认为这可以通过软件包来解决tokcycle。这是我的尝试。

\settcEscapechar{:}
\newif\iffirstchar
\Characterdirective{%
    \ifx#1|%
        #1%
    \else%
        \iffirstchar%
            \global\firstcharfalse%
            +#1%
        \else%
            -#1%
        \fi%
    \fi%
}

\newcommand{\csvboldreader}[4]{%
    \global\firstchartrue%
    \csvreader[tabular=\tokencyclexpress #1\endtokencyclexpress, boldhead]{#2}{#3}{#4}
}

\begin{document}
\csvboldreader{lcc}{sample.csv}{}{\csvcoli & \csvcolii & \csvcoliii}
\end{document}

不幸的是,它会抛出一个错误illegal token 'c' used。如果我调用

\tokencyclexpress lcc\endtokencyclexpress

单独来看,字符串转换正确。我遗漏了什么?

我必须承认我对这个软件包不太熟悉siunitx,并且我想我会再问两个关于它的问题:

  1. 最简洁的方法\sisetup是将数字与标题居中对齐,但彼此之间按照小数点对齐?有没有比{S[table-format=1.2]}手动设置每列更好的方法?
  2. @{}手册中出现的用途是什么siunitx?我的第一个猜测是不必为每一列使用括号,但这似乎不正确,因为tabular=@{} l S S[table-format=2.2] @{}不起作用。

答案1

请参阅补充材料以了解替代方案。

至于tokcycle问题的部分(第 3 项),发布的方法存在两个问题:

  1. 在可选参数内运行令牌循环\csvreader不起作用。

  2. 即使传递带有正确标记的宏(如tabular=\mypreamble)也不起作用。必须传递实际代币序言tabular

因此,需要做几件事。必须在调用之前执行标记循环\csvreader,并且必须将结果保存在\cytoks标记列表中。这需要将\Characterdirective的直接输出更改<tokens>为等效\addcytoks{<tokens>}格式。通过使用\tokcyclexpress(宏)而不是(伪环境),即使结果存储在 中,也可以抑制输出\tokencyclexpress的自动排版。\the\cytoks\cytoks

到目前为止,一切顺利。但即使在这里,tabular=\the\cytoks中的选项\csvreader也不起作用。因此,必须将调用分为两部分:\def\tmp{\csvreader[tabular=} 后跟\expandafter\tmp\the\cytoks, boldhead]{#2}{#3}{#4}。这样,\the\cytoks在调用 之前,将其扩展为实际所需的标记\csvreader

\documentclass{article}
\usepackage{csvsimple, siunitx, booktabs, array,tokcycle}

\begin{filecontents*}[overwrite]{sample.csv}
Player, Merlin, Mordred
Andrew, 0.6, 0.55
Ben, 0.54, 0.62
\end{filecontents*}

\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{-}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}#1\ignorespaces}

\csvstyle{boldhead}{
    no head,
    table head=\toprule\rowstyle{\bfseries},
    late after first line=\\ \midrule, 
    table foot=\bottomrule
}
\sisetup{round-mode=places, round-precision=2, round-integer-to-decimal}

\settcEscapechar{:}
\newif\iffirstchar
\Characterdirective{%
    \ifx#1|%
        \addcytoks{#1}%
    \else%
        \iffirstchar%
            \global\firstcharfalse%
            \addcytoks{+#1}%
        \else%
            \addcytoks{-#1}%
        \fi%
    \fi%
}

\newcommand{\csvboldreader}[4]{%
    \global\firstchartrue%
    \tokcyclexpress{#1}%
    \def\tmp{\csvreader[tabular=}%
    \expandafter\tmp\the\cytoks, boldhead]{#2}{#3}{#4}
}

\begin{document}
\csvboldreader{lcc}{sample.csv}{}{\csvcoli & \csvcolii & \csvcoliii}
\end{document}

在此处输入图片描述

补充

siunitx以下是支持列类型以及粗体(或其他)第一行的替代方法:

\documentclass{article}
\usepackage{siunitx, booktabs, array, tokcycle, readarray}
\begin{filecontents*}[overwrite]{sample.csv}
Player, Merlin, Mordred
Andrew, 0.6, 0.55
Ben, 0.54, 0.62
\end{filecontents*}
\sisetup{round-mode=places, round-precision=2, round-integer-to-decimal}
\newif\iffirstrow
\Characterdirective{%
  \iffirstrow
    \tctestifx{,#1}{\addcytoks{&\xxcmd}}{\addcytoks{{#1}}}
  \else
    \tctestifx{,#1}{\addcytoks{&}}{\addcytoks{#1}}
  \fi
}
\Macrodirective{%
  \iffirstrow
    \tctestifx{\\#1}{\firstrowfalse\addcytoks{#1\midrule}}{\addcytoks{#1}}
  \else
    \addcytoks{#1}
  \fi
}
\newcommand\csvxreader[3][\bfseries]{%
  \readarraysepchar{\\}%
  \readdef{#3}\mytab
  \firstrowtrue
  \def\xxcmd{#1}%
  \expandafter\tokcyclexpress\expandafter{\mytab}%
  \begin{tabular}{#2}%
  \toprule
  #1%
  \the\cytoks
  \bottomrule
  \end{tabular}%
}
\begin{document}
\csvxreader[\scshape]{lcc}{sample.csv}

\bigskip
\csvxreader{lSS}{sample.csv}
\end{document}

在此处输入图片描述

相关内容