xelatex编译器lstlings环境下代码字体失效,关键字,标识符,注释等都没法加粗,倾斜?

2019-08-11 13:42发布

源代码\documentclass[a4paper,10pt]{ctexart} %\usepackage{xeCJK} \usepackage{fancybox} \usepackage{listi...


源代码

\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条回答
Carcino
2019-08-11 14:27 .采纳回答

1. 如果一定要使用 `times` 宏包,需要手动指定字体编码为 `OT1`。

\documentclass{ctexart}
\usepackage{listings}
\usepackage[OT1]{fontenc}
\usepackage{times}
\begin{document}
\begin{lstlisting}[language=C]
int main (int argc, char *argv[])
{
  return 0;
}
\end{lstlisting}
\end{document}

2. `times` 宏包已经过时(见 https://ctan.org/pkg/times),替代它的是 `math­ptmx`。`math­ptmx` 也过时了,现在推荐使用 `newtx` 宏包集,具体是 `newtxtext` 和 `newtxmath` 两个宏包。


使用时,也要注意字体编码。


3. xetex 的默认编码是 `TU`,所以会产生 `TU/ptm/m/n` 字体找不到的错误。建议直接使用在视觉上和 ptm 一致的 TeX Gyre Termes 字体。参考 https://tex.stackexchange.com/q/303320


4. 最后,请保持例子尽量短,以方便他人阅读和查错。

 - 例如,为了展示问题,插入的 c 语言的片段是否能简短一些?

 - 其他的精简方式,可以参考上方我提供的例子。

一周热门 更多>

相关问答