根据布尔值将 lstlisting 替换为 verbatim

根据布尔值将 lstlisting 替换为 verbatim

我用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

我的建议是允许同时加载listingsverbatim并使用一个通用(新)环境来保存所有代码。在 下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接受可选参数。

相关内容