使用非英文字符的软件包

使用非英文字符的软件包

我想使用 LaTeX 包minted为我的 c 和 Cuda 代码着色。我需要用捷克语在代码中写注释。我使用inputenc带有捷克语的包utf-8,捷克字符(ěščřžýáíé)在整篇论文中效果很好,但minted块:

LaTeX 来源:

    \begin{minted}{c}
        double m[4];    // staticky alokované pole
    \end{minted}

输出pdf:

    double m[4];    // staticky alokovan\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \

编辑:我试过 XeTeX。minted 可以很好地处理 XeTeX 和捷克字符。但 assymptote 对我来说无法与 XeTeX 配合使用。在 XeTeX 的 .asy 文件上使用 asy 命令占用了我 100% 的 CPU,但在短时间内没有生成任何输出。

编辑:pdflatex 的示例:

   \documentclass[a4paper, pt11]{article}
   \usepackage[utf8]{inputenc}
   \usepackage{fullpage}
   \usepackage[english, czech]{babel}

   % More symbols
   \usepackage{amsmath}
   \usepackage{amssymb}
   \usepackage{latexsym}


   \usepackage{graphicx}
   \usepackage{asymptote}
   \usepackage{minted}

   \begin{document}
   \begin{figure}[h]
    \begin{asy}
        import unicode;
        size(15cm);
        fill((0, 0)--(0.5, 0)--(0.5, 1)--(0, 1)--cycle, red);
        fill((0.5, 0)--(6, 0)--(6, 1)--(0.5, 1)--cycle, blue);
        fill((6, 0)--(32, 0)--(32, 1)--(6, 1)--cycle, green);
        draw((0.25, 1.1)--(0.25, 1.9));
        label("znaménko", (0.25,2), N);
        label("exponent", (3.25,1), N);
        label("mantisa", (18,1), N);
        for(int i=0; i < 64; ++i) {
            draw((0.5i, 0)--(0.5i + 0.5, 0)--(0.5i + 0.5, 1)--(0.5i, 1)--cycle);
        }
        label("$63$",(0.25,0),S);
        label("$52$",(5.75,0),S);
        label("$0$",(31.75,0),S);
    \end{asy}
    \caption{Uspořádání \emph{double} v paměti}
    \label{doublemem}
   \end{figure}

    \begin{minted}{c}
    double m[4];    // staticky alokované pole
    m[0] = 1;       // přímé nastavení první složky
    double *n = (double *) malloc(pocet_cisel * 4 * sizeof (double));   // dynamická alokace
    n[4 + 0] = 1;   // přímý přístup do první složky druhého čísla
    free(n);        // vyčištění paměti
   \end{minted}
   \end{document}

答案1

fancyvrb这是和的补丁minted。这应该可以minted处理 Unicode pdfTeX 可以处理的任何内容。@KonradRudolph 所有这些都归结为确保在将所有内容\detokenize保存到文件之前对其进行处理。

在此处输入图片描述

\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[english, czech]{babel}

\usepackage{fullpage}
\usepackage{minted}

\makeatletter
\newcommand{\minted@write@detok}[1]{%
  \immediate\write\FV@OutFile{\detokenize{#1}}}%

\newcommand{\minted@FVB@VerbatimOut}[1]{%
  \@bsphack
  \begingroup
    \FV@UseKeyValues
    \FV@DefineWhiteSpace
    \def\FV@Space{\space}%
    \FV@DefineTabOut
    %\def\FV@ProcessLine{\immediate\write\FV@OutFile}% %Old, non-Unicode version
    \let\FV@ProcessLine\minted@write@detok %Patch for Unicode
    \immediate\openout\FV@OutFile #1\relax
    \let\FV@FontScanPrep\relax
%% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures)
    \let\@noligs\relax
%% DG/SR modification end
    \FV@Scan}
    \let\FVB@VerbatimOut\minted@FVB@VerbatimOut

\renewcommand\minted@savecode[1]{
  \immediate\openout\minted@code\jobname.pyg
  \immediate\write\minted@code{\expandafter\detokenize\expandafter{#1}}%
  \immediate\closeout\minted@code}
\makeatother

\begin{document}

\begin{minted}{c}
double m[4];    // staticky alokované pole
m[0] = 1;       // prímé nastavení první složky
double *n = (double *) malloc(pocet_cisel * 4 * sizeof (double));   // dynamická alokace
n[4 + 0] = 1;   // prímý prístup do první složky druhého císla
free(n);        // vycištení pameti
\end{minted}

\mint{c}|double m[4];    // staticky alokované pole|

\end{document}

编辑 2013/07/30

等效代码现已纳入minted开发版本GitHub

答案2

minted不完全支持inputenc;在 LaTeX 中结合 Unicode 使用外部工具几乎是不可能的。

您要么需要使用 XeTeX 或 LuaTeX 而不是纯 LaTeX,要么使用另一个荧光笔包来代替minted- 但正如您所见,它们在 Unicode 方面也存在一些问题。

我个人建议你使用特克斯。它随每个现代 LaTeX 系统一起提供。您只需使用xelatexluatex命令代替pdflatex进行排版即可。

答案3

在我的 windows7-64 + Python3 + French + 2013-04-30th 中,这对我有用:

  • python 部分:
    • 安装 python 3.3 (32 位),​​以及以下子项目:
      . easy_install,(之后需要安装 pygmentize)
      . pygmentize,
    • 为了将 pygmentize 添加到我的路径中,我必须将 pygmentize.exe 和 pygmentize-script.py :
      . 从 C:\Python33\Scripts
      . 复制到 C:\Python33
  • tex 部分:
    • 安装 TexLive 或 Miketex (2.9+),如果没有安装,
    • 检查其中是否有 xelatex,以及模块“minted”和“polyglossia”,
    • 如果已经是,也许检查一下这些模块版本是否是最新的,
  • tex 编辑器参数化(以 texmaker 为例,其他的可能有所不同):
    • 使用 texmaker v4.0.1+ (或 >= 3.5.1) (32 位 usb 或完整安装版本),
    • 检查其默认文件保存模式是否为“utf-8”,
    • 配置 xelatex 编译如下:
      xelatex -8bit -shell-escape -synctex=1 -interaction=nonstopmode %.tex
      “-8bit” 用来替换每个漂亮空格中的“TAB”字符
      “-shell-escape”我不记得了(见其他帖子)
    • 将默认的“快速编译”设置为 xelatex+pdf:(实际上,xelatex 将编译为 .xvd,并且似乎只有 .pdf 查看器可用)
    • 然后使用“quickcompilation”将您的.tex 转换为.pdf。
  • 调整您以前的“.tex”文件:
    • 从旧的 .tex 中删除 {inputenc} 、 {babel} 引用,
    • 添加 {polyglossia},
  • 工作.tex 文件:

    %Format: WML-LaTeX2e
    %This work for Mathematics+French characters+Minted usage
    %For more complex case
    \documentclass[10pt,a4paper,notitlepage]{article}
    \usepackage{amsmath,amssymb}
    \usepackage[T1]{fontenc}
    %\usepackage[ansinew]{inputenc} no more
    %\usepackage[utf8]{inputenc} no more  
    %\usepackage[english, french]{babel} no more
    %\usepackage{fr} no more
    \usepackage{a4}
    
    % and now with
    \usepackage{polyglossia}
    \usepackage{fancyhdr}
    \usepackage{listings}
    \usepackage{minted}
    
    \topmargin -1.5cm 
    \headheight 0cm 
    \headsep 0.8cm 
    \topskip 0cm 
    \textheight 28cm 
    \footskip 1.5cm 
    \textwidth 18cm 
    \oddsidemargin -1cm 
    \evensidemargin 0cm 
    
    \begin{document}
    
    \centerline{\fbox{\begin{minipage}{10cm}\textbf {
    \begin{center}
     Titre accentué
    \end{center}
    }
    \end{minipage}}}
    
    
    \noindent Essai script
    
    \begin{minted}[mathescape]{python}
    # des caractères français
    for j in range(1,10) :
        print("c'est la fête !")
    \end{minted}
    \end{document}
    

答案4

值得一提的是,此示例与 ConTeXt MkII(使用 pdftex 引擎)配合使用效果很好。minted我没有使用软件包,而是使用了vimConTeXt 模块,它与 minted 类似,但使用 vim 来突出显示文件。

\enableregime[utf-8]
\usemodule[vim]

\definevimtyping[C]

\starttext
\startC   
  double m[4];    // staticky alokované pole
\stopC
\stoptext

输出文件写入正确。因此,vim 可以正确突出显示它,并且生成的 pdf 也很好。这表明在 LaTeX 中可以正确处理编码,pdftex因此在 LaTeX 中也应该可以正确处理编码。

相关内容