我已定义一个,newcommand
以便为我的 LaTeX 文档创建可重复使用的“需求”组件。我遇到的问题是,似乎我需要将整个命令放在一行中,这使其非常难以阅读。
我想这样写:
\newcommand{\requirement}[5]{
\vspace{1cm}
\large\textsf{\textbf{#1}}
\textsc{Type: #2 | Supported by: #3}
\textsf{Description:}
#4
\textsf{Justification:}
#5
}
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{At the front page of the webshop there should be a grid displaying the available products.}
{Users visiting the site need a way to discover products.}
但编译时出现错误:
! Paragraph ended before \text@command was complete.
<to be read again>
\par
l.1348 \{R1:
目前我知道的唯一能编译的方法就是将所有内容放在一行上:
\requirement{R1: Should display available products}{MVP}{Interview with client}{At the front page of the webshop there should be a grid displaying the available products.}{Users visiting the site need a way to discover products.}
这个例子很短,有些需求可能有几百个字,这意味着一行就会长得可笑。有没有办法将参数拆分为多行命令?
编辑
由于某种原因(不要问我为什么),我忽略了我正在使用 Pandoc 编译文档的事实,通过查看这里的一些答案,似乎 Pandoc 是导致“行分割”不起作用的原因。但我还没有解决这个问题。
答案1
问题是,您在一个参数内部或两个参数之间有一个完全空白的行。完全空白的行(不计算空格)会变成\par
。单个换行符会变成空格,因此这对您的参数来说没有问题(正常参数之间的空格会被忽略)。
因此,您可以将它们拆分到多行,例如:
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{At the front page of the webshop there should be a grid displaying the available products.}
{Users visiting the site need a way to discover products.}
下面的做法同样适用:
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{%
At the front page of the webshop there should be a grid displaying the
available products.%
}
{Users visiting the site need a way to discover products.}
(请注意,我使用 a%
删除了第四个参数开始和结束处的空格,这是由换行符引起的)
并且您可以通过在空白行中放置 来忽略它%
,因此以下方法同样有效,因为没有隐式\par
标记(%
不必是行中的第一个东西,行首的空格会被忽略,只需在行中放置 就会%
删除\par
):
\requirement
%
{R1: Should display available products}
%
{MVP}
%
{Interview with client}
%
{%
At the front page of the webshop there should be a grid displaying the
available products.%
}
%
{Users visiting the site need a way to discover products.}
\large
请注意,您提供的代码中的 的使用是错误的,\large
如果您不想将当前组/文档的其余部分变成 ,则必须将其放入范围中\large
。此外,我会\par
在宏的定义中使用显式标记,而不是两个连续的换行符:
\newcommand{\requirement}[5]{%
\vspace{1cm}%
{\large\textsf{\textbf{#1}}\par}%
\textsc{Type: #2 | Supported by: #3}\par
\textsf{Description:}\par
#4\par
\textsf{Justification:}\par
#5\par
}
您可能需要考虑使用description
环境来输出。以下用于enumitem
自定义使用的description
环境。
\documentclass[]{article}
\usepackage{enumitem}
\newcommand\requirement[5]
{%
\vspace{1cm}%
{\large\sffamily\bfseries#1\par}%
\textsc{Type: #2 | Supported by: #3}\par
\begin{description}[font=\normalfont\sffamily,nosep,style=nextline]
\item[Description:] #4
\item[Justification:] #5
\end{description}%
}
\begin{document}
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{%
At the front page of the webshop there should be a grid displaying the
available products.%
}
{Users visiting the site need a way to discover products.}
\end{document}
答案2
请给予
\requirement%
{R1: Should display available products}%
{MVP}%
{Interview with client}%
{At the front page of the webshop there should be a grid
displaying the available products.}%
{Users visiting the site need a way to discover products.}
既然你这样做了,也请改变
\newcommand{\requirement}[5]{
到
\newcommand{\requirement}[5]{%
一个完整的最小工作示例 - 请注意,我在代码中添加了一些基本的管理功能 - 以及它的输出:
\documentclass{article}
\newcommand{\requirement}[5]{%
\begingroup
\setlength\parindent{0pt}
\vspace{1cm}
\par\noindent
{\large\textsf{\textbf{#1}}\par}
\textsc{Type: #2 | Supported by: #3}
\textsf{Description:}
#4
\textsf{Justification:}
#5
\endgroup\par\vspace{1cm}
}
\begin{document}
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{At the front page of the webshop there should be a grid displaying the available products.}
{Users visiting the site need a way to discover products.}
\end{document}
答案3
你的代码不可能产生错误。输入以下命令几乎可以重现该错误
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{At the front page of the webshop there should be a grid displaying the available products.}
{Users visiting the site need a way to discover products.}
另一方面,您的代码在很多方面都很薄弱。
您正在声明
\large
哪个将从第一次调用开始影响整个文档\requirement
(仅受组端的限制)。所有段落都受到标准缩进的影响;也许您将其设置
\parindent
为零,但无论如何最好说明\noindent
。\vspace
最好发行之间段落;但是,您应该使用\addvspace
,这样就不会添加到使用相同\addvspace
宏定义的其他垂直空间(例如在章节标题之后)。定义内部可以使用空行,但是它们会
\par
在需求中间形成分页符,而您也不希望如此。
这是修复版本。您可以在新行中输入每个参数,但保留不参数之间留空行。我认为,在每个参数前留几个空格更好,这样更容易阅读代码。
我认为 1cm 不是一个好的间距,可能\bigskipamount
更好。
\documentclass{article}
\newcommand{\requirement}[5]{%
\par% <--- very important
\addvspace{1cm}% better than \vspace in this case
\noindent{\large\textsf{\textbf{#1}}\par}\nopagebreak
\noindent\textsc{Type: #2 | Supported by: #3}\\*
\textsf{Description:}\\*
#4\\*
\textsf{Justification:}\\*
#5\par
}
\begin{document}
\requirement
{R1: Should display available products}
{MVP}
{Interview with client}
{At the front page of the webshop there should be a grid displaying the available products.}
{Users visiting the site need a way to discover products.}
\end{document}