有条件建设环境

有条件建设环境

下面的代码尝试构建starting code ending code一个environment 有条件

例如:若的值为#11,则环境的起始代码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

相关内容