如何使用listings
包和lualatex
编译器正确显示编程语言代码中的抛光字符?
主程序:
//Zażółć gęślą jaźń
#include <iostream>
int main() {
std::cout << "Hello World!\n";
return 0;
}
主要.tex:
\documentclass[12pt, a4paper]{article}
\usepackage[polish]{babel}
\babelprovide[transforms = oneletter.nobreak]{polish}
\usepackage{listings}
\usepackage{xcolor}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
extendedchars=true,
tabsize=2
}
\lstset{style=mystyle}
\hbadness=99999
\begin{document}
\lstinputlisting[language=C++]{main.cpp}
\end{document}
第一个结果 ( lualatex
):
我的目标是得到如下图所示的结果(lualatex
编译中):
提前谢谢了!
答案1
这里有几个错误。
- 在 pdflatex 中
transforms = oneletter.nobreak
不支持 babel 选项。因此您必须使用 lualatex(或删除该功能) - 在 lualatex 中不要使用 fontenc 或 inputenc. (顺便说一下,在较新版本中你不必使用 inputenc有什么理由使用 inputenc 吗?)在这种特殊情况下,您必须删除 fontenc 才能使其正常工作。(或者同时添加 fontenc 和 literate works,但何必呢?)
listings
有一些错误,不允许它处理代码点> 255 的字符。这个问题的一半是https://tex.stackexchange.com/a/25396/250119. 使用那里的修复
\documentclass[12pt, a4paper]{article}
\usepackage[polish]{babel}
\babelprovide[transforms = oneletter.nobreak]{polish}
\usepackage{listings}
\usepackage{xcolor}
\makeatletter
\lst@InputCatcodes
\def\lst@DefEC{%
\lst@CCECUse \lst@ProcessLetter
^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
żłćęśąźń%
^^00}
\lst@RestoreCatcodes
\makeatother
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
extendedchars=true,
tabsize=2
}
\lstset{style=mystyle}
\hbadness=99999
\begin{document}
\noindent Przetestujmy możliwości języka C++, oraz wiszące litery na końcu zdania i coś tam jeszcze: \newline
\lstinputlisting[language=C++]{main.cpp}
\end{document}
似乎对我有用。
(您可能可以推断,除了现有的字符之外,还包含每个代码点 > 255 的字符一次。您也可以使用^^^^<4 digits>
或^^^^^^<6 digits>
符号来通过十六进制代码指定。)
答案2
仅用于比较。我们可以做什么OpTeX:
\fontfam[lm]
\hsize=10cm
\noindent
Przetestujmy możliwości języka C++, oraz wiszące litery na końcu zdania i coś tam jeszcze:
\verbinput \hisyntax{C} (-) main.cpp
\bye
结果: