如何使用 xparser 获取多个可选参数?

如何使用 xparser 获取多个可选参数?

我正在尝试创建一个新的环境来列出一些成就,如下所示:

\documentclass{article}

\begin{document}

\setlength{\tabcolsep}{0 pt}

\newenvironment{twentylong}{
    \begin{tabular*}{\textwidth}{l @{\extracolsep{\fill}}l}
}{
    \end{tabular*}
}

\newcommand{\twentyitemlong}[5]{
    #1 & \parbox[t]{0.8\textwidth}{\textbf{#2}\hfill
        #3\\
        #4\\
        #5\\
    }\\
}

\begin{twentylong}
    \twentyitemlong{since 2019}{Bachelor of Coding in LaTeX}{TimBukToo}{First-Class Honours}{TimBukToo University}
    %\twentyitemlong{<dates>}{<title>}{<location>}{<description1>}{<description2>}
\end{twentylong}

\end{document}

所需的输出基本上是一个具有三列的表格(无边框),其中第一列只有日期,第二列有标题、描述 1 和描述 2,最后一列为位置。

但是,我有一些成就没有一些必需的参数。例如,我可能只想输入 #1 和 #3,而 #2、#4 和 #5 留空。

我知道这个xparse包可能可以用于实现这个功能,但我不确定该怎么做。我尝试自己阅读文档,并咨询谷歌教授,但都无济于事。

具体来说,我希望参数 #2 到 #5 都是可选的,并且当不提供它们时,输出应该是空白的。

例如,我尝试了以下操作:

\documentclass{article}

\usepackage{xparse}

\begin{document}

\setlength{\tabcolsep}{0 pt}

\newenvironment{twenty}{
    \begin{tabular*}{\textwidth}{l @{\extracolsep{\fill}}l}
}{
    \end{tabular*}
}

\NewDocumentCommand{\twentyitem}{m O{} O{} O{} O{} O{}}{
    #1 & \parbox[t]{0.8\textwidth}{\textbf{#2}\hfill
        #3\\
        #4\\
        #5\\
    }\\
}

\begin{twenty}
    \twentyitem{since 2019}{Bachelor of Coding in LaTeX}{TimBukToo}{First-Class Honours}{TimBukToo University}
    %\twentyitem{<dates>}{<title>}{<location>}{<description1>}{<description2>}
\end{twenty}

\end{document}

但是,输出与以前不同,所有内容似乎都打印在一行上,即参数之间的空格和换行符不存在。

我究竟做错了什么?

任何直观的解释或建议都将不胜感激!此外,如果有更简洁的方法,也请随时提供意见!

答案1

这是稍微简化的代码,我相信它可以满足您的要求。我删除了-type 列parbox,并简单地添加了p{}计算出的中间列剩余空间,尽管您可以添加tabularx并使用X列来代替,从而p{\dimexpr ....}进一步简化代码。

可选参数的数量相当大。我认为在这种情况下,情况还不算太糟,但如果参数以某种方式相互依赖,比如说第二个参数依赖于第一个参数,第三个参数依赖于第二个参数等等,那么测试数量就会大幅增加。

关于测试,以下代码片段

\IfValueT{#1}{\notblank{#1}{% Run this if not blank}{}}

执行以下操作:使用O{}\IfValueT{#1}{% True}测试是否#1已被使用,然后\notblank{#1}{% True}{% False}测试是否#1包含任何内容。\noblank{}{}特别有用,因为[][ ]将被测试为负数,因此在代码中被忽略。

\documentclass{article}
\usepackage{etoolbox}

\NewDocumentEnvironment{twenty}{+b}{%
    \setlength{\tabcolsep}{3 pt}%
    \renewcommand{\arraystretch}{1.5}%
    \begin{tabular*}{\linewidth}{@{}
            p{2cm}
            p{\dimexpr\linewidth-4cm-4\tabcolsep-4\arrayrulewidth}
            p{2cm}
        @{}}
        #1
    \end{tabular*}}{}

\NewDocumentCommand{\twentyitem}{m O{} O{} O{} O{}}{%
    #1
    &
    \IfValueT{#2}{\notblank{#2}{\textbf{#2}}{}}%
    \IfValueT{#4}{\notblank{#4}{\par#4}{}}%
    \IfValueT{#5}{\notblank{#5}{\par#5}{}}
    &
    \IfValueT{#3}{\notblank{#3}{#3}{}}}


\begin{document}
\noindent
\begin{twenty}
    \twentyitem{since 2019}[Bachelor of Coding in LaTeX][TimBukToo][First-Class Honours][TimBukToo University] \\
    \twentyitem{since 2019}[Bachelor of Coding in LaTeX][TimBukToo] \\
    \twentyitem{since 2019}[Bachelor of Coding in LaTeX][][][TimBukToo University] \\
    \twentyitem{since 2019}[][][ ][TimBukToo University] \\
\end{twenty}
\end{document}

在此处输入图片描述

相关内容