撇号打断了列表中的注释

撇号打断了列表中的注释

我定义了一个命令来简化(伪)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 样式)分隔符。clstdrvrs'bm

\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} 

我添加了清单的最后一行以确保保留正常的字符串行为:

在此处输入图片描述

相关内容