在列表中使用 Consolas 字体系列(整个文档为越南语)

在列表中使用 Consolas 字体系列(整个文档为越南语)

我正在用越南语编写一份关于 C++ 的文档,因此当然会有一些代码。我将使用lstlisting环境,因为它是代码的最佳选择。

但是,\ttfamily(默认等宽字体)对我来说似乎太宽了。我想改用 Consolas。但是,inconsolata当序言中有以下行时,包不起作用:

\usepackage[utf8]{vietnam}

或者

\usepackage[vietnamese=nohyphenation]{hyphsubst}
\usepackage[vietnamese]{babel}

如果没有其中任何一个,所有越南语字母(如)都会在 PDF 中消失,尽管inconsolata可以工作。

我正在使用pdfLaTeX。我知道我可以轻松地在 Consolas 中将 更改为输入,但将前导码从 转换为XeLaTeX似乎有点太复杂了。我尝试了四五次都没有成功。pdfLaTeXXeLaTeX

有人能给我一些想法吗?非常感谢!

以下是我的简短序言(如果您可以将其转换为XeLaTeXLuaLaTeX):

\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{vietnam}
\usepackage[unicode]{hyperref}
\usepackage{inconsolata}
\usepackage{listings}
\lstset{basicstyle=\footnotesize\fontfamily{zi4}\selectfont,}
...

我的完整代码可以找到这里

答案1

正如您所说,您愿意尝试 Xe-/LuaLaTeX,我已尝试将您询问的部分转换为 LuaLaTeX(涉及将字体更改为类似 Palatino 的 TeX Gyre Pagella)。

listings可能仍然无法很好地处理您的unicode序列(“越南字母”),因此您应该使用该literate选项。

\documentclass[11pt,a4paper]{article}
\usepackage[vietnamese=nohyphenation]{hyphsubst}
\usepackage[vietnamese]{babel}
\usepackage[unicode]{hyperref}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} 
\usepackage{amsmath} 
\usepackage{amsfonts}
\usepackage{amssymb} 
\usepackage{listings}
\usepackage{xcolor}
\usepackage{indentfirst}
\usepackage{marvosym} %For emoji
\usepackage{fontspec}
\usepackage{unicode-math}
\setmainfont{TeX Gyre Pagella}
\setsansfont{TeX Gyre Heros}
\setmonofont{Inconsolata}
\setmathfont{TeX Gyre Pagella Math}

\setlength{\parskip}{1ex}
\setlength{\parindent}{3ex}
\hypersetup{
    colorlinks=true,
    linkcolor=black,
    filecolor=black,      
    urlcolor=darkscarlet,
    citecolor=darkscarlet
}
\urlstyle{tt}
\definecolor{darkscarlet}{rgb}{0.34, 0.01, 0.1}
\definecolor{ultramarineblue}{rgb}{0.25, 0.4, 0.96}
\definecolor{alizarin}{rgb}{0.82, 0.1, 0.26}
\definecolor{cadmiumgreen}{rgb}{0.0, 0.42, 0.24}
\definecolor{desertsand}{rgb}{0.93, 0.79, 0.69}
\lstdefinestyle{mystyle}{
    backgroundcolor=\color{white},   
    commentstyle=\color{alizarin},
    keywordstyle=\color{ultramarineblue},
    stringstyle=\color{cadmiumgreen},
    basicstyle=\footnotesize\ttfamily,%\ttfamily,
    breakatwhitespace=false,         
    breaklines=true,                 
    captionpos=b,                    
    keepspaces=true,                 
    showspaces=false,                
    showstringspaces=false,
    showtabs=false,                  
    tabsize=2,
    language=C++,
    frame=single
}
\lstset{style=mystyle}
\pagestyle{plain}
\begin{document}
Một cái code đơn giản trong C++: (\textit{A simple code written in C++:})
\begin{lstlisting}
#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"Hello World!";
}
\end{lstlisting}
\end{document}

答案2

如果您打算在列表中使用越南字符(我猜是用于评论),我建议使用minted

有一些等宽字体支持 T5(越南语)编码。下面是一些示例,inconsolata但最后一个字体不支持越南语,因此不适合此目的。

\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{vietnam}
\usepackage{minted}
\usepackage{inconsolata}
\usepackage[unicode]{hyperref}

%%% this is only for the inconsolata example
\makeatletter
\define@key{FV}{fontencoding}%
  {\ifstrempty{#1}%
    {\let\FV@FontEncoding\relax}%
    {\ifstrequal{#1}{none}%
      {\let\FV@FontEncoding\relax}%
      {\def\FV@FontEncoding{\fontencoding{#1}}}}}
 \expandafter\def\expandafter\FV@SetupFont\expandafter{%
   \expandafter\FV@FontEncoding\FV@SetupFont}
 \fvset{fontencoding=none}
\makeatother
%%% end

%%% this is only for the txtt example
\makeatletter
\input{t5txtt.fd}
\DeclareFontShape{T5}{txtt}{m}{it}{<->ssub * txtt/m/sl}{}
\makeatother
%%% end

\begin{document}

\subsubsection*{TXTT}

\setminted{fontfamily=txtt}

\begin{minted}{cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"Hello World!";
}
// Một cái code đơn giản trong C++
\end{minted}

\subsubsection*{LMTT}

\setminted{fontfamily=lmtt}

\begin{minted}{cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"Hello World!";
}
// Một cái code đơn giản trong C++
\end{minted}

\subsubsection*{QCR}

\setminted{fontfamily=qcr}

\begin{minted}{cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"Hello World!";
}
// Một cái code đơn giản trong C++
\end{minted}

\subsubsection*{ZLMTT}

\setminted{fontfamily=zlmtt}

\begin{minted}{cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"Hello World!";
}
// Một cái code đơn giản trong C++
\end{minted}

\subsubsection*{ZI4}

\fvset{fontencoding=T1}
\setminted{fontfamily=zi4}

\begin{minted}{cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"Hello World!";
}
\end{minted}

\end{document}

在此处输入图片描述

相关内容