带参数的自定义环境:在垂直模式下不能使用“宏参数字符 #”

带参数的自定义环境:在垂直模式下不能使用“宏参数字符 #”

我想定义一个新环境,在标题框中显示纯文本块,并准确重现空白。像这样

\begin{PlainText}{My Title}
Foo
Bar
\end{PlainText}

我正在收集各种提示来形成一个定义,但它不起作用。

\newenvironment{TextFile}[1]{\ttfamily}{\par}
{
    #1\\[1ex]
    \begin{center}
    \begin{tabular}{|p{0.9\textwidth}|}
    \hline
    \\
}
{ 
    \\ \\
    \hline
    \end{tabular} 
    \end{center}
}

我只理解了 80% 的工作原理,我认为第一行的意思是

TextFile 是一个接受一个参数的新环境,其中字体是等宽字体,\par 表示保留空格,如 HTML <pre>

#1\\[1ex]我收到以下错误

 You can't use `macro parameter character #' in vertical mode.

当它工作时,它看起来应该是这样的:

在此处输入图片描述

答案1

定义

\newenvironment{TextFile}[1]{\ttfamily}{\par}
{
    #1\\[1ex]
    \begin{center}
    \begin{tabular}{|p{0.9\textwidth}|}
    \hline
    \\
}
{ 
    \\ \\
    \hline
    \end{tabular} 
    \end{center}
}

是错误的,至少是带有 的部分{ #1\\ }{...},它们肯定是真正的文档主体,而不是语句之后的外部内容,{\par}后者是end code环境的一部分。

这种方式#1 ...等意味着在环境定义之后进行排版,除非定义本身被包装在另一个命令或环境中,否则它必然会失败。

\documentclass{article}



\newenvironment{TextFile}[1]{\ttfamily%
    #1 \\[1ex]
    \begin{center}
    \begin{tabular}{|p{0.9\textwidth}|}
    \hline
    \\
}{% 
    \\ \\
    \hline
    \end{tabular} 
    \end{center}
    \par
}

\begin{document}

\begin{TextFile}{Foo}
Learning \LaTeXe\ is fun!
\end{TextFile}

\end{document}

在此处输入图片描述

答案2

您的定义不起作用,因为\newenvironment具有以下语法:

\newenvironmnt{<envname>}[<parms>][<opt>]
  {<begin envname>}% \begin{<envname>}
  {<end envname>}% \end{<envname>}

您使用它时没有使用可选参数(因此[<opt>]已被删除),但提供了四个强制参数而不是两个(这两个参数是{<begin envname>}{<end envname>})。 中指定的任何参数[<parms>]仅在 内可用{<begin envname>},但您试图在 内使用它第三强制参数,不存在的地方。


以下方法可确保标题和后续块保持在一起并适合文本块宽度。

在此处输入图片描述

\documentclass{article}

\usepackage{tabularx}

\newenvironment{TextFile}[1]
  {% \begin{TextFile}{#1}
   \par\ttfamily
   \noindent
   % http://tex.stackexchange.com/a/42331/5764
   \tabularx{\linewidth}{|X|}
     \multicolumn{1}{c}{#1} \\[1ex]
     \hline \\
  }{% \end{TextFile}
     \\ \\
     \hline
    \endtabularx
    \par\medskip
  }

\begin{document}

\begin{TextFile}{My Title}
Foo \\
Bar
\end{TextFile}

\end{document}

另一种选择是使用listings

在此处输入图片描述

\documentclass{article}

\usepackage{listings}

\lstnewenvironment{TextFile}[1]
  {\lstset{
    basicstyle = \ttfamily,
    frame      = lrtb,
    title      = {\ttfamily #1}}}
  {}

\begin{document}

\begin{TextFile}{My Title}
Foo
Bar
\end{TextFile}

\end{document}

相关内容