允许数学模式和 UTF-8 字符的伪代码环境?

允许数学模式和 UTF-8 字符的伪代码环境?

我通常使用的编写伪代码的是 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,在mathescaped 文本之后,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 扩展和\pdffiledumppdfTeX 的 -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}

在此处输入图片描述

相关内容