我用latex2rtf
将 latex 文档转换为 .rtf,然后转换为 MS-word(请参阅此主题)。为此,我设置了一个自定义类,并限制哪些包被用作 latex2rtf
只接受有限的命令子集(参见手册页)。latex2rtf
提供一个布尔值,,如果您使用作为编译器,\iflatextortf
则将其设置为 true 。latex2rtf
我现在需要显示代码清单并维护latex2rtf
功能。这意味着,我想在序言中定义一些内容,以将调用替换为类似when为 true 的\lstlisting{}
内容。\begin{verbatim} ... \end{verbatim}
\iflatextortf
问题:是否可以根据的值在lstlisting
和环境之间切换,并保留环境的内容?verbatim
\iflatextortf
该解决方案不需要安装任何软件包,并且应该与 latex2rtf 中有限的命令子集一起使用(参见第 8.6.1 节)。这应该可以帮助我使用 运行编译latex2rtf
。不幸的是,使用 verbatim 包的解决方案不起作用。
我理想的解决方案是这样的:
\newif\iflatextortf
\iflatextortf
\documentclass[12pt,letterpaper]{report}
% whatever my replacement for lstlistings is %
\else
\documentclass[10pt,letterpaper]{report}
\usepackage{listings}
% something fancy with listings
\lstnewenvironment{codeenv}[1][]{\lstset{basicstyle=\small\ttfamily}#1}{}
\fi
我想要一些比在原始 .tex 上使用查找和替换更优雅的东西!
答案1
我的建议是允许同时加载listings
和verbatim
并使用一个通用(新)环境来保存所有代码。在 下listings
,您可以使用以下方式定义此环境
\lstnewenvironment{codeenv}[1][]{}{}%
您可以使用verbatim
来定义此环境
\newenvironment{codeenv}[1][]{\verbatim}{\endverbatim}%
现在,您可以listings
使用传统的 来决定是否应该加载\@ifundefined{lstlisting}{<undefined>}{<defined>}
。这是一个用例:
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\usepackage{verbatim}% http://ctan.org/pkg/verbatim
\makeatletter
\@ifundefined{lstlisting}{% If listings is loaded
\newenvironment{codeenv}[1][]{\verbatim}{\endverbatim}%
}{% listings is not loaded
\lstnewenvironment{codeenv}[1][]{\lstset{basicstyle=\ttfamily,#1}}{}%
}
\makeatother
\begin{document}
\begin{codeenv}[basicstyle=\ttfamily]
This is some verbatim text.
\end{codeenv}
\end{document}
现在你要做的就是包装
\usepackage{listings}% http://ctan.org/pkg/listings
在你的“布尔开关”中。
如果verbatim
不允许使用该包,则可以从LaTeX 内核围绕verbatim
环境的定义:
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\makeatletter
\begingroup \catcode `|=0 \catcode `[= 1
\catcode`]=2 \catcode `\{=12 \catcode `\}=12
\catcode`\\=12 |gdef|@xverbatim#1\end{codeenv}[#1|end[codeenv]]
|endgroup
\@ifundefined{lstlisting}{
\newcommand{\codeenv}[1][]{\@verbatim \frenchspacing\@vobeyspaces \@xverbatim}
\def\endcodeenv{\if@newlist \leavevmode\fi\endtrivlist}
}{%
\lstnewenvironment{codeenv}[1][]{\lstset{basicstyle=\ttfamily,#1}}{}%
}
\makeatother
\begin{document}
\begin{codeenv}[basicstyle=\ttfamily]
This is some verbatim text.
\end{codeenv}
\end{document}
verbatim
最后一种相当基本的方法可能是在整个文档中使用环境作为代码示例,并重新定义此环境以使其像listings
加载常规列表一样工作:
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\makeatletter
\@ifundefined{lstlisting}{}{%
\let\verbatim\relax%
\lstnewenvironment{verbatim}{\lstset{basicstyle=\ttfamily}}{}%
}
\makeatother
\begin{document}
\begin{verbatim}
This is some verbatim text.
\end{verbatim}
\end{document}
由于listings
不提供\lstrenewenvironment
,\let
因此\verbatim
可以\relax
释放verbatim
环境以进行重新定义。为了易于使用,最好避免verbatim
接受可选参数。