当使用LaTeX的“listings”包时,如何显示直引号而不是弯引号?

25

我正在使用LaTeX的"listings"包来格式化源代码。不幸的是,我得到的是卷曲引号而不是直引号。由于卷曲引号不总是指向正确的方向,这看起来很糟糕。如何获得直引号呢?

我更喜欢不改变或过滤源代码本身。过滤代码以适当更改 " 为 `` 或 '' 是可行的,但在一行上有多个引号或引用跨越多行时,这比说起来容易做起来难。或者您可以使用符号或其他许多方法。但我真的很想保持源代码不变。

LaTeX示例:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
Fahrenheit=input("What is the Fahrenheit temperature?")
Celsius=(5.0/9.0)*(Fahrenheit-32)
print"The temperature is",Celsius,"degrees Celsius"
\end{lstlisting}
\end{document}

示例输出(在Windows上使用Miktex):

源代码图像

错误输出图像的直接链接


它会改变源代码,但你可以使用位于引号左侧的 `(键)和位于常规引号键右侧的 ' 来修正引号方向。 - Alex
6个回答

27

我在文档中看到(该文档应该随包一起分发,但可在http://www.ctan.org/tex-archive/macros/latex/contrib/listings/listings.pdf找到)listings有一个可设置的属性upquote来解决这个问题。

文档示例:

upquote=⟨true|falsefalse
  determines whether the left and right quote are printed ‘’ or `'. This 
  key requires the textcomp package if true. 

做类似以下的事情

\lstset{upquote=true}

在开始列表环境之前,使用begin标签,或者使用

\begin{lstlisting}[upquote=true]
...
\end{lstlisting}
这个属性可能已经在适当语言的定义中为您设置好了(请再次查看文档,在第12页上有预定义语言的大列表)。
使用:
\lstloadlanguages{<dialects you need>}

在标题中添加语言设置,使用上述任意一种选择选项的公约。


这看起来很有前途,但不幸的是,当我尝试时它没有起作用。即使我在Linux和Windows上使用Miktex并将upquote设置为true,花括号引号仍然出现。将其设置为false也没有起作用。 - Paul Vincent Craven
这就是我只是匆匆浏览文档的结果。ChrisN似乎有正确的属性,但我鼓励您在适当的情况下使用预定义的语言。并且,请阅读文档,里面都有。干杯。 - dmckee --- ex-moderator kitten
我在实际工作中使用预定义的语言。为了使示例最小化,我剥离了很多我正在做的事情。那个PDF是一个很好的资源,但是我仍然没有找到答案。谢谢。 - Paul Vincent Craven
1
当我注意到文档和编译警告告诉我要使用\usepackage{textcomp}时,这对我很有帮助。 - Xiong Chiamiov
这是正确的答案,而不是使用不同的风格。 - Shriraj Hegde

11

你考虑过为代码列表使用等宽字体(打字机字体)吗?下面的示例可以实现:

\documentclass{article}
\usepackage{listings}
\lstset{basicstyle=\ttfamily} % <<< This line added
\begin{document}
\begin{lstlisting}
Fahrenheit=input("What is the Fahrenheit temperature?")
Celsius=(5.0/9.0)*(Fahrenheit-32)
print"The temperature is",Celsius,"degrees Celsius"
\end{lstlisting}
\end{document}

2
在基本样式中使用\ttfamily对我来说也非常好,尽管它会导致我失去列表包为我的语言提供的样式(例如加粗关键字)。除了重新定义语言风格之外,还有什么想法吗? - jasonb

10

dmckee的回答 可能有效。如果你不考虑最后一个条件,也就是允许更改代码,那么有一种更通用的解决方法,我在(La)TeX将字符呈现得与我的期望有所不同时会使用\symbol命令。我将其列在此处,因为它在其他情况下也可能很有用:

\newcommand{\qq}{\symbol{34}} % 34 is the decimal ascii code for "

然后是你的例子:

\begin{lstlisting}
...
print{\qq}The temperature is{\qq},Celsius,{\qq}degrees Celsius{\qq}
...
\end{lstlisting}

请注意花括号,它们据说将列表返回到LaTeX模式(请参见包的escapechars选项)。


如何在自由文本中使其工作?目前它还不能正常运行。 - user2603796

9

这里有一个解决方案

\usepackage[T1]{fontenc}  
\usepackage{textcomp}  
\usepackage{lmodern}  

% in the listings package configuration, try:  
literate={"}{\textquotedbl}1,  

1
我认为这是最直接的答案。没有必要修改文档本身。它优雅地解决了双引号问题! - pauljohn32
最佳答案! - Bub Espinja

7

我也遇到了同样的问题,使用fontspec,解决方法是不要设置\defaultfontfeatures{Mapping=tex-text},而是只在主字体和无衬线字体上具体设置Mapping=tex-text,并让等宽字体自行处理。:)


1
也许是因为我作为LaTeX用户早期安装了listings,但我很惊讶地发现没有listings包行为会有所不同。
我的解决方案与David Hanak的类似,但我使用了LaTeX Cheat Sheet中描述的双引号符号。http://stdout.org/~winston/latex
\newcommand{\QQ}[1]{``#1''}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接