我通常使用的编写伪代码的是 listings 包,但不幸的是,我发现自己正在用我的母语(葡萄牙语)编写文档,并且我需要在伪代码中写入 UTF-8 字符,而 listings 却无法运行。
此外,我还需要使用数学模式。
我具体尝试执行的代码是这样的:
\begin{lstlisting}[mathescape=true]
Para todo $B \subseteq N$:
Se as colunas de $A_B$ são linearmente independentes:
Resolver o sistema $A_B x = b$.
Se este tiver solução $x$:
Se $x \geq 0$:
Definir $v \in \mathbb R^n$ de modo a que $v_B = x$ e $v_{N\setminus B} = 0$
Adicionar $v$ à lista de vértices.
\end{lstlisting}
这段特定的代码不起作用,因为我收到以下错误:
! Package inputenc Error: Unicode char �\expandafter (U+4F1)
(inputenc) not set up for use with LaTeX.
(尽管我确实需要 inputenc 来排版 UTF-8 字符,而且据我所知,这是一个列表问题。)
特定的包并不重要,我只是在寻找一种用我的母语排版伪代码的方法,同时仍然能够使用数学模式。
这也排除了 fancyvrb 和 alltt,因为它们不与 sub 和 superscripts 一起使用。
短暂性脑缺血发作
答案1
您应该使用 编译代码XeLaTeX
。它非常适合这种类型的编码。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[portuguese]{babel}
\usepackage{amsmath,amssymb}
\usepackage{listings}
\begin{document}
Português para principiantes with formula
\[A(\lambda)=\cos \lambda + \sin \lambda\]
\begin{lstlisting}[mathescape=true]
Para todo $B \subseteq N$:
Se as colunas de $A_B$ são linearmente independentes:
Resolver o sistema $A_B x = b$.
Se este tiver solução $x$:
Se $x \geq 0$:
Definir $v \in \mathbb R^n$ de modo a que $v_B = x$ e $v_{N\setminus B} = 0$
Adicionar $v$ à lista de vértices.
\end{lstlisting}
\end{document}
答案2
Sebastiano 的答案适用于基于 UTF-8 的引擎。要与 pdfLaTeX 一起使用,您可以使用\lstset{literate=...}
:
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[portuguese]{babel}
\usepackage{amsmath,amssymb}
\usepackage{listings}
\newcommand{\R}{\mathbb R}
% taken from: https://tex.stackexchange.com/a/381647/134574
\lstset{
keepspaces, % Apparently this works... (https://tex.stackexchange.com/a/46695/134574)
literate=
{á}{{\'a}}1
{à}{{\`a}}1
{ã}{{\~a}}1
{é}{{\'e}}1
{ê}{{\^e}}1
{í}{{\'i}}1
{ó}{{\'o}}1
{õ}{{\~o}}1
{ú}{{\'u}}1
{ü}{{\"u}}1
{ç}{{\c{c}}}1
}
\begin{document}
\begin{lstlisting}[mathescape=true]
Para todo $B \subseteq N$:
Se as colunas de $A_B$ são linearmente independentes:
Resolver o sistema $A_B x = b$.
Se este tiver solução $x$:
Se $x \geq 0$:
Definir $v \in \R^n$ de modo a que $v_B = x$ e $v_{N\setminus B} = 0$
Adicionar $v$ à lista de vértices.
\end{lstlisting}
\end{document}
关于评论中指出的间距问题。看起来有一个错误listings
,在mathescape
d 文本之后,d 文本后面的空格literate
消失了。我问了一个问题关于这个问题,Ulrich Diez 显然指出了问题所在。
要解决该问题,请在文件中添加以下定义:
\makeatletter
\def\lst@Literate#1#2#3{%
\ifx\relax#2\@empty\else
\lst@CArgX #1\relax\lst@CDef
{}
{\let\lst@next\@empty
\lst@ifxliterate
\lst@ifmode \let\lst@next\lst@CArgEmpty \fi
\fi
\ifx\lst@next\@empty
\ifx\lst@OutputBox\@gobble\else
\lst@XPrintToken \let\lst@scanmode\lst@scan@m
\lst@token{#2}\lst@length#3\relax
\lst@XPrintToken
% ↓ Missing switch added by Ulrich Diez to fix the spacing issue
\lst@whitespacefalse %!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
\fi
\let\lst@next\lst@CArgEmptyGobble
\fi
\lst@next}%
\@empty
\expandafter\lst@Literate
\fi}
\makeatother
或者更简洁一点:
\usepackage{etoolbox}
\makeatletter
\patchcmd\lst@Literate
{\lst@XPrintToken\fi}
{\lst@XPrintToken\lst@whitespacefalse\fi}
{}{}
答案3
Heiko Oberdiek 的listingsutf8-包裹提供了解决该问题的解决方法:
它增强了 -command 的语法\lstinputlisting
,以便它可以读取以 utf8 编码的文件,并在“馈送”到列表包的内部之前,在内部以某种 8 位编码对其进行重新编码。
如果 latin-1 编码 (ISO8859-1)(一种 8 位编码)可以对伪代码中需要的所有字符进行编码,则您可能可以使用filecontents*
来自文件内容-包裹用于写入 utf8 编码的临时文件,然后使用\lstinputlisting
由以下命令增强的命令listingsutf8-包裹用于读取该 utf8 文件,并在将其输入到列表-包裹。
如下例所示,您可以使用其他 8 位编码来代替 latin-1,以防它们更适合您的需要。
无论如何使用listingsutf8-包裹需要 ε-TeX 扩展和\pdffiledump
pdfTeX 的 -primitive。换句话说:无论是在 .dvi 模式下运行还是在 .pdf 模式下运行,您都需要一些带有 ε-TeX 扩展的 pdfLaTeX 引擎。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[portuguese]{babel}
\usepackage{amsmath,amssymb}
\usepackage{listings}
\usepackage{listingsutf8}
\usepackage{filecontents}
\begin{document}
\begin{filecontents*}{tempfile.tex}
Para todo $B \subseteq N$:
Se as colunas de $A_B$ são linearmente independentes:
Resolver o sistema $A_B x = b$.
Se este tiver solução $x$:
Se $x \geq 0$:
Definir $v \in \mathbb R^n$ de modo a que $v_B = x$ e $v_{N\setminus B} = 0$
Adicionar $v$ à lista de vértices.
\end{filecontents*}
\lstinputlisting[mathescape=true, inputencoding=utf8/latin1]{tempfile.tex}
\end{document}