![带参数的自定义环境:在垂直模式下不能使用“宏参数字符 #”](https://linux22.com/image/347713/%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%EF%BC%9A%E5%9C%A8%E5%9E%82%E7%9B%B4%E6%A8%A1%E5%BC%8F%E4%B8%8B%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%E2%80%9C%E5%AE%8F%E5%8F%82%E6%95%B0%E5%AD%97%E7%AC%A6%20%23%E2%80%9D.png)
我想定义一个新环境,在标题框中显示纯文本块,并准确重现空白。像这样
\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}