我是这个论坛的新手,也是 LaTeX 的新手,所以提前感谢你的帮助。我正在尝试制作一个包含不同饮料配方的文档,其中每种饮料的成分不超过四种。我做了一个命令,每次我想要一个新配方时,都会制作一个表格来保存每种饮料的配方。当我尝试一次列出两个配方时,问题就出现了。我要么必须通过添加空行来考虑可选参数,要么在 TeX 文档中手动添加三个换行符。
以下是我目前所掌握的信息:
\documentclass{article}
\usepackage{array}
\usepackage{multirow}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcommand{\recipe}[9]{\begin{tabular}{C{1cm} p{5cm}}
\multicolumn{2}{l}{\textit{#1}} \\ \hline #2 & #3 \\ #4 & #5 \\ #6 & #7 \\ #8 & #9 \\ \end{tabular} \newline}
当我使用时会产生一个单一的配方
\recipe{White Russian}{3}{vodka}{2}{coffee liqueur}{3}{milk}
但是,当我在下一行输入另一个食谱(例如,只有两种原料)时,就会出现错误。
再次感谢!
答案1
如果您希望宏具有可变数量的参数,那么标准方法是将参数处理为分隔列表。由于您的成分是成对出现的,因此您还需要一种方法来区分数量和成分。在这里,我使用列表etoolbox
处理宏\forcsvlist
来处理列表,并创建了一个简单的分隔宏来区分数量和成分。使用分隔宏可以使输入语法更简单一些。
该\recipe
宏现在接受 2 个参数:名称和成分列表。每种成分都用 表示\IN <amount>|<substance>
。
我确信还有其他方法可以做同样的事情,并且很可能有人也会发布 LaTeX3 解决方案。
\documentclass{article}
\parindent=0pt
\usepackage{array}
\usepackage{etoolbox}
\newcommand{\addrow}[1]{#1\\}
\def\IN#1|#2{#1 & #2}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcommand{\recipe}[2]{\begin{tabular}{C{1cm} p{5cm}}
\multicolumn{2}{l}{\textit{#1}} \\ \forcsvlist\addrow{#2} \end{tabular} \par}
\begin{document}
\recipe{White Russian}{\IN 3|vodka,\IN 2|coffee liqueur,\IN 3|milk}
\recipe{Martini}{\IN 3|gin,\IN |vermouth}
\end{document}