![使用一个可选参数创建新环境](https://linux22.com/image/251225/%E4%BD%BF%E7%94%A8%E4%B8%80%E4%B8%AA%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%E5%88%9B%E5%BB%BA%E6%96%B0%E7%8E%AF%E5%A2%83.png)
我想在 LaTeX 中创建一个带有一个可选参数的新环境。以下是我使用的:
\newenvironment{argument}[1][]{%
\par
\noindent
\textbf{Argument#1:}
\noindent}
{}
当没有参数时,它会在“Argument”一词后立即排版“:”,这才是应该的样子。
但是,当使用可选参数时,LaTeX 不会在单词“Argument”和提供的可选参数之间添加空格。
换句话说,我想要实现的是,如果提供了可选参数(例如 A),那么 LaTeX 应该在“Argument”一词后添加一个空格,例如:
论点A:一些文字
当没有可选参数时,它应该是这样的(没有空格):
争论:一些文字
答案1
#1
在环境定义之前添加一个空格,并指定\unskip
(将删除空格)作为可选参数的默认值。
\documentclass{article}
\newenvironment{argument}[1][\unskip]{%
\par
\noindent
\textbf{Argument #1:}
\noindent}
{}
\begin{document}
\begin{argument}
Some text.
\end{argument}
\begin{argument}[A]
Some text.
\end{argument}
\end{document}
答案2
可以通过基本的 LaTeX 命令来定义新环境\newenvironment
。但我推荐使用这个包xparse
它还提供了定义新环境的命令和实用程序;例如,它提供了一个简单的测试来检查可选参数是否为空。
\documentclass{scrreprt}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentEnvironment{argument} { o }
{
\par\noindent
\IfNoValueTF{#1} { \textbf{Argument:~} }{ \textbf{Argument~#1:~} }
\ignorespaces
}
{}
\ExplSyntaxOff
\begin{document}
\begin{argument}
some text
\end{argument}
\begin{argument}[A]
some text
\end{argument}
\end{document}
命令ExplSyntaxOn
&ExplSyntaxOff
用于忽略定义内部的一些不需要的空格。
命令ExplSyntaxOn
是语法的激活expl3
。您可以将其与 -symbol 进行比较makeatletter
。@
除了其他一些定义之外,ExplSyntaxOn
将忽略所有空格。因此Hello World
将打印“HelloWorld”。要获取空格,您必须使用波浪号~
。这样Hello~World
可以打印“Hello World”。这就是我编写的原因\textbf{Argument~#1:~}
。
正如 egreg 指出的,您还可以使用:
\ExplSyntaxOn
\NewDocumentEnvironment{argument} { o }
{
\par\noindent
\textbf{Argument \IfValueT { #1 } { ~ #1 } : ~ }
\ignorespaces
}
{}
\ExplSyntaxOff
答案3
如果可选参数为空(或未使用),我只需在其中添加空格即可。我还删除了第二个参数,\noindent
因为它在那个位置上没有任何用处,因为段落已经开始了。
\documentclass{article}
\newenvironment{argument}[1][]{%
\par
\noindent
\textbf{Argument\ifx\newenvironment#1\newenvironment\else\space\fi#1:} }
{}
\begin{document}
\begin{argument}
Some text.
\end{argument}
\begin{argument}[A]
Some text.
\end{argument}
\end{document}