使用一个可选参数创建新环境

使用一个可选参数创建新环境

我想在 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}

相关内容