是否可以根据字符串的值定义环境。我有一个通用的前言文件,可用于大量不同的文档。根据文档的性质,我希望对环境进行略微不同的定义。实际上,我要求重载环境定义。
具体来说,我有一个名为 的环境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
似乎在这里并不适用(分支是在标记化的东西中完成的)。