源代码

\documentclass[a4paper,10pt]{ctexart}
% \usepackage{xeCJK}
\usepackage{fancybox}
\usepackage{listings}
% \usepackage[]{fontspec}
% \lstset{
%         language=C,
%         numbers=left,
%         numberstyle=\tiny,
%         basicstyle=\small\ttfamily,
%         identifierstyle=\color{blue}\itshape,
%         stringstyle=\color{purple},
%         keywordstyle=\color{red}\bfseries,
%         commentstyle=\itshape,
%         directivestyle=\color{blue},
%         frame=shadowbox,
%         %framerule=0pt,
%         %backgroundcolor=\color{pink},
%         rulesepcolor=\color{red!20!green!20!blue!20}}
%         %rulesepcolor=\color{brown}
%         %xleftmargin=2em,xrightmargin=2em,aboveskip=1em
        

\usepackage{xcolor}
\usepackage{times}
\begin{document}
\section{Counting Numbers of Uppercase Characters}
\begin{center}
\begin{lstlisting}[language=C]

/*===================================================
* FileName: counter.c
 * Author  : Shaobin Li <shawpinlee@gmail.com>
 * Date    : 2017-09-13
* Description: count numbers of uppercase
* characters from input streams, and output
* the numbers respectively.
*=================================================*/
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
 
#define SIZE 26
 

int main (int argc, char *argv[])
{
  int array[SIZE];
  int i;
  char c;
 
  for (i = 0; i < SIZE; i++)
    array[i] = 0;
 
  while ((c = getchar ()) != EOF)
    {
      if (isupper (c))
        {
          array[c - 'A']++;
        }
    }
  for (i = 0; i < 26; i++)
    printf ("%c:%5d\n", (char) ('A' + i), array[i]);
 
  return 0;
}
 
\end{lstlisting}
\end{center}
\end{document}

xelatex编译警告

a-xe-warning.png

xelatex编译结果

a-xelatex.png

pdflatex编译结果,这是期望得到的

a-pdflatex.png

然而这里又遇到了问题,当我在lstlisting环境下加入中文注释时,pdflatex不能编译,而xelatex确可以。下面是加入中文注释后的源代码

\documentclass[a4paper,10pt]{ctexart}
% \usepackage{xeCJK}
\usepackage{fancybox}
\usepackage{listings}
% \usepackage[]{fontspec}
% \lstset{
%         language=C,
%         numbers=left,
%         numberstyle=\tiny,
%         basicstyle=\small\ttfamily,
%         identifierstyle=\color{blue}\itshape,
%         stringstyle=\color{purple},
%         keywordstyle=\color{red}\bfseries,
%         commentstyle=\itshape,
%         directivestyle=\color{blue},
%         frame=shadowbox,
%         %framerule=0pt,
%         %backgroundcolor=\color{pink},
%         rulesepcolor=\color{red!20!green!20!blue!20}}
%         %rulesepcolor=\color{brown}
%         %xleftmargin=2em,xrightmargin=2em,aboveskip=1em
        

\usepackage{xcolor}
\usepackage{times}
\begin{document}
\section{Counting Numbers of Uppercase Characters}
\begin{center}
\begin{lstlisting}[language=C]

/*===================================================
* FileName: counter.c
 * Author  : Shaobin Li <shawpinlee@gmail.com>
 * Date    : 2017-09-13
* Description: count numbers of uppercase
* characters from input streams, and output
* the numbers respectively.
*=================================================*/
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
 
#define SIZE 26
 

int main (int argc, char *argv[])//这是中文注释
{
  int array[SIZE];
  int i;
  char c;
 
  for (i = 0; i < SIZE; i++)
    array[i] = 0;
 
  while ((c = getchar ()) != EOF)
    {
      if (isupper (c))
        {
          array[c - 'A']++;
        }
    }
  for (i = 0; i < 26; i++)
    printf ("%c:%5d\n", (char) ('A' + i), array[i]);
 
  return 0;
}
 
\end{lstlisting}
\end{center}
\end{document}

pdflatex的编译错误提示

a-pdf-warning.png

最后是MWE。其中的副本是加入中文注释后的

mwe.zip


3 回答3

4
<p></p><p></p><p>1. 如果一定要使用 `times` 宏包,需要手动指定字体编码为 `OT1`。</p><p></p><pre class="brush:css;toolbar:false"> \documentclass{ctexart} \usepackage{listings} \usepackage[OT1]{fontenc} \usepackage{times} \begin{document} \begin{lstlisting}[language=C] int&nbsp;main&nbsp;(int&nbsp;argc,&nbsp;char&nbsp;*argv[]) { &nbsp;&nbsp;return&nbsp;0; } \end{lstlisting} \end{document}</pre><p style="text-indent: 2em;"></p><p>2. `times` 宏包已经过时(见 <a href="https://ctan.org/pkg/times">https://ctan.org/pkg/times</a>),替代它的是 `math­ptmx`。`math­ptmx` 也过时了,现在推荐使用 `newtx` 宏包集,具体是 `newtxtext` 和 `newtxmath` 两个宏包。</p><p><br/></p><p>使用时,也要注意字体编码。</p><p><br/></p><p>3. xetex 的默认编码是 `TU`,所以会产生 `TU/ptm/m/n` 字体找不到的错误。建议直接使用在视觉上和 ptm 一致的&nbsp;TeX Gyre Termes 字体。参考&nbsp;<a href="https://tex.stackexchange.com/q/303320">https://tex.stackexchange.com/q/303320</a> </p><p><br/></p><p>4. 最后,请保持例子尽量短,以方便他人阅读和查错。</p><p>&nbsp;- 例如,为了展示问题,插入的 c 语言的片段是否能简短一些?</p><p>&nbsp;- 其他的精简方式,可以参考上方我提供的例子。</p><p></p><p></p>
3
<pre class="brush:plain;toolbar:false">\documentclass{ctexart} \usepackage{listings} \usepackage{newtxtext,newtxmath} \begin{document} \begin{lstlisting}[language=C] #include<stdio> /*中文注释试验*/ int main() {   printf("hello world\n");   return -1; } \end{lstlisting} \end{document}</pre><p><img src="/data/ueditor/php/upload/image/20190811/1565510552613872.png" title="1565510552613872.png" alt="image.png"></p>
0
<p>是要自己设置字体的,看看xecjk的说明文档。</p>
  • 开始提问遇到bug,刚才修改了问题。请问能详细一点吗? – 青莲剑仙 2019-08-11 13:53 回复

你的回答

请登录后回答

你的回答将会帮助更多人,请务必认真回答问题。