我正在尝试创建一个新的环境来列出一些成就,如下所示:
\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}