我定义了一个命令来简化(伪)C 代码的代码清单的编写:
\lstdefinestyle{c}{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=L,
columns=fullflexible,
showstringspaces=false
}
\lstnewenvironment{ccode}{
\mathligsoff\lstset{style=c}}{}
如果我使用环境,ccode
一切都会正常工作,除非使用撇号:
\begin{ccode}
int x';
// use x
x = 3;
\end{coode}
在此列表中,注释不是以斜体打印的,而是以“直”字符打印的。如果我删除'
或添加另一个,'
斜体就会恢复。这是完整的 .tex 代码:
\documentclass[]{report}
\usepackage{listings}
\usepackage{semantic}
\lstdefinestyle{c}{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=L,
columns=fullflexible,
showstringspaces=false}
\lstnewenvironment{ccode}{
\mathligsoff\lstset{style=c}}{}
\begin{document}
\begin{ccode}
int x';
// hi there
x = 3;
\end{ccode}
\end{document}
编辑:接受的答案对我来说非常完美。只是给其他读者一个提示:如果不需要显示字符串或字符 - 因此没有像“a”或“string”这样的代码 -\lstset{literate={'}{{'}}1}
也可以解决问题。
答案1
正如我在回答这个问题时 Jubobs 评论的那样,问题在于'
被视为 中的字符串分隔符C
,因此直到下一个 之前的所有内容'
都被视为字符串的一部分。您可以通过设置stringstyle=\itshape
或类似设置来看到这一点; 之后的所有内容'
都显示为字符串。
尽管在评论中进行了讨论(我建议使用更适合伪代码的东西而不是listings
),如果您必须坚持使用listings
一种解决方案,那就是将您自己的语言定义为中定义的pseudoc
副本,并将字符从-类型分隔符更改为-类型(MATLAB 样式)分隔符。c
lstdrvrs
'
b
m
\documentclass{article}
\usepackage{listings}
% modified ANSI C definition; copied from lstdrvrs.dtx
\lstdefinelanguage{pseudoC}%
{morekeywords={auto,break,case,char,const,continue,default,do,double,%
else,enum,extern,float,for,goto,if,int,long,register,return,%
short,signed,sizeof,static,struct,switch,typedef,union,unsigned,%
void,volatile,while},%
sensitive,%
morecomment=[s]{/*}{*/},%
morecomment=[l]//,% nonstandard
morestring=[b]",%
morestring=[m]',% changed from `b' to `m'
moredelim=*[directive]\#,%
moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
include,pragma,undef,warning}%
}[keywords,comments,strings,directives]%
\lstdefinestyle{pseudoc}{
language=pseudoC,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=L,
columns=fullflexible,
showstringspaces=false,
}
\lstnewenvironment{ccode}{
\lstset{style=pseudoc}}{}
\begin{document}
\begin{ccode}
int x';
// use x
x = 3;
y = 'a string'; // aside: this would be a compiler error :-)
\end{ccode}
\end{document}
我添加了清单的最后一行以确保保留正常的字符串行为: