我正在寻找一个类似的环境Verbatim
,允许我说类似下面的代码(使用缩进而不是空格):
\documentclass{article}
\usepackage{fancyvrb}
\usepackage[margin=1in]{geometry}
\begin{document}
\begin{enumerate}
\item We first set \texttt{x} to infinity if it is positive:
\begin{Verbatim}
if x > 0:
x = \infty
\end{Verbatim}
\end{enumerate}
\end{document}
然后回来确切地以下关于缩进、所有符号的转义(如\infty
)等。
问题Verbatim
是它要求我取消缩进相对于其余代码,主体部分变得不好看。(我也不能使用,verbatim
因为它迫使我使用空格。)此外,我也不知道如何在其中嵌入特殊符号。
是否有一些环境可以用不太困难的语法来解决这些问题特殊符号和数学进入代码?(理想情况下,我希望\
和$
作为转义字符,但任何不太难输入的字符都可以。)
答案1
更新
马丁·沙雷尔的lstautogobble
包使用列表包;对于其他问题,您可以使用mathescape=true
和escapeinside
选项;一个小例子:
\documentclass{article}
\usepackage{listings}
\usepackage{lstautogobble}
\lstset{basicstyle=\ttfamily,
mathescape=true,
escapeinside=||,
autogobble}
\begin{document}
\begin{enumerate}
\item We first set \texttt{x} to infinity if it is positive:
\begin{lstlisting}
if $x > 0$:
$x = \infty$
if x > 0:
x = $\infty$
\end{lstlisting}
\end{enumerate}
\end{document}
文件 lstautogobble.sty 可以在以下位置找到如何自动跳过列表中的前导空格
答案2
为了允许您随意缩进代码,TeX 通常会忽略行首的空格。
这提出了一个“先有鸡还是先有蛋”的问题:当\begin{Verbatim}
检测到时,它前面的空格已经被丢弃,除非你告诉它(环境提供了一个gobble
选项),否则 TeX 无法知道应该在逐字行的开头丢弃多少个空格。只有Verbatim
fancyvrb
里面Verbatim
行首的环境空格不会被忽略,因为它们很重要。
我并不是说这个一般问题无法解决,而是说解决方案需要对输入进行不同的读取(例如,保持在行首抛出多少个空格的计数),这在 TeX 中根本不可能实现,但可能会在 LuaTeX 中实现。
我不认为像你这样缩进代码是“好的”做法:相反,我从不在普通文本中这样做,而只在宏定义中这样做。当然,这只是个人看法。不幸的是,当您需要逐字逐句的材料时,您必须忍受“丑陋”的代码,或者使用选项明确传递缩进级别gobble
。
答案3
让我在答案中展示这些机会(对于另一条评论来说显然太长了):
正如我在评论中指出的那样,您也可以使用空格缩进,在我看来,这是更好的选择,因为它的可预测性更高。但是,请看我的示例代码:
\documentclass{article}
\usepackage{fancyvrb}
% Let us first define a custom Verbatim environment, that saves us a lot of writing
\DefineVerbatimEnvironment{VerbatimTest}{Verbatim}%
{showspaces,showtabs,commandchars=\\\{\}}% showspaces and showtabs only for visualizing
\begin{document}
Remember, options ``showspaces'' and ``showtabs'' are active.
\begin{enumerate}
\item First, no change, indenting with spaces (using the \$ sign would
require an additional definition, see fancyvrb manual, section
"Catcode characters").
\begin{VerbatimTest}
if x > 0:
x = \(\infty\)
\end{VerbatimTest}
\item Second, gobbling 8 space chars (up to nine are possible).
\begin{VerbatimTest}[gobble=8]
if x > 0:
x = \(\infty\)
\end{VerbatimTest}
\item From now on indenting with tabs, first line for comparising indented
with spaces, note that by default one tab stands for 8 (!) characters.
\begin{VerbatimTest}
First line indented with spaces
if x > 0:
x = \(\infty\)
\end{VerbatimTest}
\item Now gobbling one character (here one space or one tab).
\begin{VerbatimTest}[gobble=1]
First line indented with spaces
if x > 0:
x = \(\infty\)
\end{VerbatimTest}
\item You can define with ``tabsize'', how many spaces are represented by
one tab (here 1 tab = 4 spaces).
\begin{VerbatimTest}[tabsize=4]
First line indented with spaces
if x > 0:
x = \(\infty\)
\end{VerbatimTest}
\item Last in combination: ``tabsize=4'' and ``gobble=1''.
\begin{VerbatimTest}[tabsize=4,gobble=1]
First line indented with spaces
if x > 0:
x = \(\infty\)
\end{VerbatimTest}
\end{enumerate}
\end{document}
输出如下:
答案4
使用alltt.sty
文件然后用于\begin{alltt}
数学运算\(
例子:
\documentclass{article}
\usepackage{fancyvrb}
\usepackage[margin=1in]{geometry}
\usepackage{alltt}
\begin{document}
\begin{enumerate}
\item We first set \texttt{x} to infinity if it is positive:
\begin{alltt}
if \(x > 0\):
\(x = \infty\)
\end{alltt}
\end{enumerate}
\end{document}
并使用:
\begin{enumerate}
\item We first set \texttt{x} to infinity if it is positive:
\begin{Verbatim}[commandchars=\\\{\}, codes={\catcode`$=3\catcode`^=7}]
if $x>0$:
$x=\infty$
\end{Verbatim}
\end{enumerate}