表格、数据工具:在 \DTLif 的真部分中使用“&”

表格、数据工具:在 \DTLif 的真部分中使用“&”

我正在尝试使用 csv 文件创建一个包含两种不同类型行的表。

csv 看起来像这样

Data1,Data2,Data3
Caption1,,
Value1,Value2,Value3
Value4,Value5,Value6
Caption2,,
Value8,Value9,Value10
.....

每个标题都应该使用表格的所有三列,因此我尝试了以下代码:

\documentclass[a4paper,12pt]{article}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{datatool}
\usepackage{float}
\usepackage{wrapfig}

\begin{document}

\begin{figure}[H]
    \DTLloaddb{Database_Name}{Test.csv}
    \centering
    \begin{tabular}{l c c}
        \toprule
        a & b & c \\
        \midrule
        \DTLforeach{Database_Name}
            {\a=Data1,\b=Data2,\c=Data3}
            {
%-----------------------
                \DTLifnullorempty{\c}{\multicolumn{3}{c}{\a}}{\a & \b & \c}
%-----------------------
                \DTLiflastrow{}{\\}} \\
            \bottomrule
        \end{tabular}
    \end{figure}

    \end{document}

但如果我在这种情况下使用它们,\multicolumn它们就&不起作用。您知道如何解决这个问题吗?

答案1

LaTeX 中的单元格tabular是隐式本地组。这会破坏许多循环宏。一种解决方法是先使用循环宏在标记寄存器中编写表格,然后输出标记寄存器以设置表格:

\documentclass[a4paper,12pt]{article}
\usepackage{booktabs}
\usepackage{datatool}
\newtoks\tabletoks

\begin{document}
\begin{figure}
    \DTLloaddb{Database_Name}{abc.csv}
    \centering
    \makeatletter
    \tabletoks={%
      \begin{tabular}{l c c}
      \toprule
      a & b & c \\
      \midrule
    }%
    \DTLforeach{Database_Name}{%
      \a=Data1,\b=Data2,\c=Data3%
    }{%
      \DTLifnullorempty{\c}{%
        \protected@edef\x{%
          \noexpand\multicolumn{3}{c}{\a}%
        }%
      }{%
        \protected@edef\x{\a & \b & \c}%
      }%
      \tabletoks\expandafter{\the\expandafter\tabletoks\x\\}%
    }%
    \tabletoks\expandafter{%
      \the\tabletoks
      \bottomrule
      \end{tabular}%
    }%
    \the\tabletoks
  \end{figure}
\end{document}

结果

\protected@edef用于扩展宏\a\b\c,然后将它们放入令牌寄存器中。

相关内容