latex 表变量/可选的许多参数

latex 表变量/可选的许多参数

我想创建一个新的表格环境,使我可以添加 n(1-10)个参数而不添加额外的列(这样下面的两个示例都可以正常工作)。

这是我的代码:

\documentclass{article} 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[sfdefault]{AlegreyaSans}
\RequirePackage{booktabs}
\usepackage[table,x11names,dvipsnames,table]{xcolor}
\usepackage{tabularx}

\definecolor{mygreen}{RGB}{126,169,105}
\definecolor{myblue}{RGB}{9,28,87}

\begin{document}

\newenvironment{tabulargreen}[3]
  { 
% \renewcommand{\tempcaption}{#3}
 \rowcolors{1}{mygreen!20}{mygreen!10}
   \begin{tabular}{lcr}
   \rowcolor{mygreen}
   \textcolor{white}{\bfseries #1} & \textcolor{white}{\bfseries #2} & \textcolor{white}{\bfseries #3} \\
   }
  {
%      \caption{\tempcaption}
   \end{tabular}
   }

\begin{tabulargreen}{Name}{Zahl}{Nummer}
Modul eins & 2 & 3 \\
Modul zwei & 5 & 6 \\
Modul drei & 8 & 9 \\
Modul vier & 2 & 3 \\
Modul fünf & 5 & 6 \\
Modul sechs & 8 & 9 \\
\end{tabulargreen}

\vspace{5mm}

\begin{tabulargreen}{Name}{Zahl}
Modul eins & 3 \\
Modul zwei & 4 \\
Modul drei & 7 \\
\end{tabulargreen}

\end{document}

表格仍然如下所示:

在此处输入图片描述

“M” 从何而来?我怎样才能摆脱它?

问候并非常感谢!

米莉

答案1

如果只有一个参数,那么会更容易,即标题和单元格之间用通常的 分隔&

\documentclass{article} 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[sfdefault]{AlegreyaSans}
\usepackage[table,x11names,dvipsnames,table]{xcolor}
\usepackage{xparse}

\definecolor{mygreen}{RGB}{126,169,105}
\definecolor{myblue}{RGB}{9,28,87}

\ExplSyntaxOn

\seq_new:N \l_millie_tabgreen_head_in_seq
\seq_new:N \l_millie_tabgreen_head_out_seq

\NewDocumentEnvironment{tabulargreen}{m}
 {
  \seq_set_split:Nnn \l_millie_tabgreen_head_in_seq { & } { #1 }
  \seq_set_map:NNn
   \l_millie_tabgreen_head_out_seq
   \l_millie_tabgreen_head_in_seq
   { \millie_tabgreen_head:n { ##1 } }
  \rowcolors{1}{mygreen!20}{mygreen!10}
  \begin{tabular}
   {
    l
    *{ \int_eval:n { \seq_count:N \l_millie_tabgreen_head_in_seq - 2 } } { c }
    r
   }
   \rowcolor{mygreen}
   \seq_use:Nn \l_millie_tabgreen_head_out_seq { & } \\
 }
 {
  \end{tabular}
 }
\cs_new_protected:Nn \millie_tabgreen_head:n
 {
  \textcolor{white}{\bfseries #1}
 }
\ExplSyntaxOff

\begin{document}

\begin{tabulargreen}{Name & Zahl & Nummer}
Modul eins & 2 & 3 \\
Modul zwei & 5 & 6 \\
Modul drei & 8 & 9 \\
Modul vier & 2 & 3 \\
Modul fünf & 5 & 6 \\
Modul sechs & 8 & 9 \\
\end{tabulargreen}

\vspace{5mm}

\begin{tabulargreen}{Name & Zahl}
Modul eins & 3 \\
Modul zwei & 4 \\
Modul drei & 7 \\
\end{tabulargreen}

\end{document}

在此处输入图片描述

这个想法是计算标题的数量,减去 2 并制作一个合适的前言l c … c r;对标题进行修改以添加所请求的格式,然后构建表格。

答案2

正如大卫所说,你仍然需要传递根据您定义tabulargreen环境的方式确定参数:

\begin{tabulargreen}{Name}{Zahl}{}

根据评论,代码已被修改为允许 4 个参数(其中前两个是必需的,后两个是可选的)。因此,您不需要将其调用为

\begin{tabulargreen}{Name}{Zahl}{}{}

在此处输入图片描述

然后,tabulargreen您需要在选项中检查可选参数是否为空,如果为空则不定义列标题。我使用包ifmtarg来执行此操作,但任何其他检测空选项的方法(例如使用xparse)都可以。

此技术最多可扩展至 9 个参数。除此之外,您还需要进行其他处理(请参阅参考)。

笔记:

  • 您缺少尾随:\end{tabular}%——我已将其添加到下面的代码中。这将删除表格后面的额外水平间距(这不会在此显示任何不同平均能量损失,但如果你看\fbox{}一下它的用法,tabulargreen你就会看到差异。

参考:

代码:

\documentclass{article} 
%\usepackage[utf8]{inputenc}
%\usepackage[T1]{fontenc}
%\usepackage[sfdefault]{AlegreyaSans}
\RequirePackage{booktabs}
\usepackage[table,x11names,dvipsnames,table]{xcolor}
\usepackage{tabularx}

\usepackage{ifmtarg}
\makeatletter%
    \newcommand{\IfIsEmptyArg}[3]{\@ifmtarg{#1}{#2}{#3}}%
\makeatother%

\definecolor{mygreen}{RGB}{126,169,105}
\definecolor{myblue}{RGB}{9,28,87}

\begin{document}

\newenvironment{tabulargreen}[4]% <-- Note: 4 paramaters
  { 
  %\renewcommand{\tempcaption}{#3}
  \rowcolors{1}{mygreen!20}{mygreen!10}
   \begin{tabular}{lcrr}
   \rowcolor{mygreen}
   \textcolor{white}{\bfseries #1} 
       & \textcolor{white}{\bfseries #2}
       \IfIsEmptyArg{#3}{}{& \textcolor{white}{\bfseries #3}}
       \IfIsEmptyArg{#4}{}{& \textcolor{white}{\bfseries #4}} 
       \\
   }
  {
   %\caption{\tempcaption}
   \end{tabular}% <---- Note trailing %
   }

\begin{tabulargreen}{Name}{Zahl}{Nummer}{}% <-- Note: 4 paramaters
Modul eins & 2 & 3 \\
Modul zwei & 5 & 6 \\
Modul drei & 8 & 9 \\
Modul vier & 2 & 3 \\
Modul funf & 5 & 6 \\
Modul sechs & 8 & 9 \\
\end{tabulargreen}

\par\medskip
\begin{tabulargreen}{Name}{Zahl}{}{}% % <-- Note: 4 paramaters
Modul eins & 3 \\
Modul zwei & 4 \\
Modul drei & 7 \\
\end{tabulargreen}

\par\medskip
\begin{tabulargreen}{A}{B}{C}{D}% % <-- Note: 4 paramaters
1 & 2 & 3 & 4 \\
a & b & c & d \\
\end{tabulargreen}

\end{document}

相关内容