列表和波兰字符的问题(lualatex)

列表和波兰字符的问题(lualatex)

如何使用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

这里有几个错误。

  1. 在 pdflatex 中transforms = oneletter.nobreak不支持 babel 选项。因此您必须使用 lualatex(或删除该功能)
  2. 在 lualatex 中不要使用 fontenc 或 inputenc. (顺便说一下,在较新版本中你不必使用 inputenc有什么理由使用 inputenc 吗?)在这种特殊情况下,您必须删除 fontenc 才能使其正常工作。(或者同时添加 fontenc 和 literate works,但何必呢?)
  3. 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

结果:

相关内容