下面的代码尝试构建starting code
ending code
一个environment
有条件。
例如:若的值为#1
1,则环境的起始代码test
为:
\begin{minipage}{1.0\linewidth}
\begin{minipage}{0.4\textwidth}
结束代码是:
\end{minipage}
CASE 1
some other things after test content
\end{minipage}
以此类推,也就是说,“起始码”和“结束码”都会根据#1的值而改变。
但是,它不起作用。代码有什么问题?
代码:
\documentclass{article}
\usepackage{listings}
\newenvironment{test}[1]
{
\begin{minipage}{1.0\linewidth}
\ifcase#1
\or
\begin{minipage}{0.4\textwidth}
}
{
\end{minipage}
CASE 1
\or
\begin{minipage}{0.5\textwidth}
}
{
\end{minipage}
CASE 2
\or
\begin{minipage}{0.6\textwidth}
}
{
\end{minipage}
CASE 3
\fi
some other things after test content
\end{minipage}
}
\begin{document}
\begin{test}{1}
\begin{lstlisting}
some code
\end{lstlisting}
\end{test}
\end{document}
編輯:
\newenvironment{test}[1]
{%
\begin{minipage}{1.0\linewidth}
\ifcase#1
\or\begin{minipage}{0.4\textwidth}
\or\begin{minipage}{0.5\textwidth}
\or\begin{minipage}{0.6\textwidth}
\fi
}
{%
\end{minipage}
\ifcase#1
\or case 1
\or case 2
\or case 3
\fi
some other things after test content
\end{minipage}
}
答案1
你最初展示的代码充满了语法错误。你不能从“开始部分”开始\ifcase
,到“结束部分”结束,因为 TeX 会跳过“错误分支”的标记而不进行解释,所以它几乎永远不会扩展\end{test}
。
您稍后显示的代码由于不同的原因而不起作用:#1
是不是\newenvironment
自从 LaTeX 首次发布以来,就从未允许在尾随参数中使用。
为什么?可能是因为 Leslie Lamport 不知道该怎么做,或者不想在“结尾部分”允许使用参数。
如何“传统地”解决这个问题?很简单。
\newenvironment{test}[1]
{%
\def\argumentfortest{#1}%
\par\noindent
\begin{minipage}{1.0\linewidth}
\ifcase#1\relax
\or\begin{minipage}{0.4\textwidth}
\or\begin{minipage}{0.5\textwidth}
\or\begin{minipage}{0.6\textwidth}
\fi
}
{%
\end{minipage}%
\ifcase\argumentfortest\relax
\or case 1 %
\or case 2 %
\or case 3 %
\fi
some other things after test content%
\end{minipage}%
}
完整示例。
\documentclass{article}
\newenvironment{test}[1]
{%
\def\argumentfortest{#1}%
\par\noindent
\begin{minipage}{1.0\linewidth}
\ifcase#1\relax
\or\begin{minipage}{0.4\textwidth}
\or\begin{minipage}{0.5\textwidth}
\or\begin{minipage}{0.6\textwidth}
\fi
}
{%
\end{minipage}%
\ifcase\argumentfortest\relax
\or case 1 %
\or case 2 %
\or case 3 %
\fi
some other things after test content%
\end{minipage}%
}
\begin{document}
\subsubsection*{Argument is 1}
\begin{test}{1}
X\dotfill X\par
X\dotfill X\par
X\dotfill X
\end{test}
\subsubsection*{Argument is 3}
\begin{test}{2}
X\dotfill X\par
X\dotfill X\par
X\dotfill X
\end{test}
\subsubsection*{Argument is 3}
\begin{test}{3}
X\dotfill X\par
X\dotfill X\par
X\dotfill X
\end{test}
\end{document}
带有\NewDocumentEnvironment
, 参数能用于“结尾部分”。
\errorcontextlines=10000
\documentclass{article}
\ExplSyntaxOn
\NewDocumentEnvironment{test}{m}
{
\par\noindent
\begin{minipage}{1.0\linewidth}
\begin{minipage}{\lyl_test_factor:n { #1 }\textwidth}
}
{
\end{minipage}
\lyl_test_post:n { #1 }~some~other~things~after~test~content
\end{minipage}
}
\cs_new:Nn \lyl_test_factor:n
{
\int_case:nn { #1 } { {1}{0.4} {2}{0.5} {3}{0.6} }
}
\cs_new:Nn \lyl_test_post:n
{
\int_case:nn { #1 }
{
{1}{case~1}
{2}{case~2}
{3}{case~3}
}
}
\ExplSyntaxOff
\begin{document}
\subsubsection*{Argument is 1}
\begin{test}{1}
X\dotfill X\par
X\dotfill X\par
X\dotfill X
\end{test}
\subsubsection*{Argument is 3}
\begin{test}{2}
X\dotfill X\par
X\dotfill X\par
X\dotfill X
\end{test}
\subsubsection*{Argument is 3}
\begin{test}{3}
X\dotfill X\par
X\dotfill X\par
X\dotfill X
\end{test}
\end{document}
答案2
当 TeX 看到 并扩展 时\ifcase
,\begin{test}
会\fi
隐藏在 中\end{test}
,因此\ifcase ... \or ... \fi
不完整并会导致错误。
因此,您必须\ifcase ... \or ... \fi
在环境的开始和结束时构造一个完整的环境。在环境结束时访问环境参数\NewDocumentEnvironment
是可行的选择之一。
您不能
#1
在最后部分使用\newenvironment
.
--- @egreg评论
\documentclass{article}
\usepackage{listings}
\NewDocumentEnvironment{test}{ m }{
\begin{minipage}{1.0\linewidth}
\ifcase#1
\or\begin{minipage}{0.4\textwidth}
\or\begin{minipage}{0.5\textwidth}
\or\begin{minipage}{0.6\textwidth}
\fi
}{
\end{minipage}
CASE #1
\ifcase #1
\or first case
\or second case
\or third case
\fi
\end{minipage}
}
\begin{document}
\begin{test}{1}
\begin{lstlisting}
some code
\end{lstlisting}
\end{test}
\begin{test}{2}
\begin{lstlisting}
some code
\end{lstlisting}
\end{test}
\begin{test}{3}
\begin{lstlisting}
some code
\end{lstlisting}
\end{test}
\end{document}
我不知道为什么你给 提供了五个强制参数\newenvironement
,而它只接受三个(环境名称、开始代码和结束代码)。可能对\ifxxx
条件、参数、分组或中的至少一个存在一些根本性的误解\newenvironment
。