环境的条件定义

环境的条件定义

是否可以根据字符串的值定义环境。我有一个通用的前言文件,可用于大量不同的文档。根据文档的性质,我希望对环境进行略微不同的定义。实际上,我要求重载环境定义。

具体来说,我有一个名为 的环境partx,我希望在某些文档中将其打印为单个块,而在其他一些文档中,它应该是可流动的。我已将单个块实现为minipage。我希望另一个不受约束,minipage以便它可以跨页面。

我可以吗超载环境?

此 MWE 显示 ::

\documentclass[11pt]{article}
\usepackage{lipsum}

% one of these is to be commented out to be able to select the approproiate partx from 
% an included file which serves as a common preamble
\newcommand{\doctype}{unbrokenpartx}
%\newcommand{\doctype}{breakblepartx}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% this part is in a seperate file, a common preamble
\newenvironment{partx}{
    \noindent\minipage{\textwidth} % ideally this directive should be conditional on \doctype
    % some stuff goes here
}{
    % some other stuff goes here
    \endminipage
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
    \begin{partx}
        \lipsum[1]
    \end{partx}
\end{document}

答案1

您可以通过不同的方式完成您想要的操作,您可以检查条件并相应地定义环境(测试只会进行一次,但它不会那么动态,您无法在不复制定义的情况下更改文档中间的内容)。以下就是这样做的。请注意,我使用\ifdefstring但生成的宏的定义方式是它需要\fi在条件内容之后。这样做的优点是允许在测试中进行可能的类别代码更改和其他内容。

\documentclass[11pt]{article}
\usepackage{duckuments}
\usepackage{etoolbox}

%\newcommand*\doctype{unbrokenpartx}
\newcommand*\doctype{breakablepartx}

\newcommand\ifdoctype[1]
  {%
    \ifdefstring{\doctype}{#1}{\iftrue}{\iffalse}%
  }
\ifdoctype{unbrokenpartx}
  \newenvironment{partx}
    {%
      \noindent\minipage{\textwidth}%
      % some stuff goes here
      \ignorespaces
    }
    {%
      % some other stuff goes here
      \endminipage
    }
\fi
\ifdoctype{breakablepartx}
  \newenvironment{partx}
    {%
      \noindent
      % some stuff goes here
      \ignorespaces
    }
    {%
      % some other stuff goes here
    }
\fi

\begin{document}
\vspace*{.8\textheight}% forcing a page break if the below is breakable
\begin{partx}
  \blindduck
\end{partx}
\end{document}

另一种可能性是只定义一次环境,但在定义中分支。每次使用环境时都必须进行测试,但中途可以轻松更改。定义将如下所示:

\newcommand\ifdoctype[1]
  {%
    \ifdefstring{\doctype}{#1}%
  }
\newenvironment{partx}
  {%
    \noindent
    \ifdoctype{unbrokenpartx}{\minipage{\textwidth}}{}%
    % some stuff goes here
    \ignorespaces
  }
  {%
    % some other stuff goes here
    \ifdoctype{unbrokenpartx}{\endminipage}{}%
  }

请注意,我也改变了定义\ifdoctype,因为该方法的优势\ifdoctype...\fi似乎在这里并不适用(分支是在标记化的东西中完成的)。

相关内容