重音字符错误地写入外部文件

重音字符错误地写入外部文件

我尝试在外部文件中写入一些字符串以用于特殊类型的索引,但使用 utf8 重音字符会出现错误。

在我的外部文件中,这些字符的显示方式与我在文档中写入的方式相同,并且这些字符以后无法读取。

我的测试代码是:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[portuges]{babel}
\usepackage[T1]{fontenc}

\newif\iffirstSiglaUse\firstSiglaUsetrue

\newcommand{\sigla}[2]{%
    \iffirstSiglaUse
        \newwrite\arqEscreveSiglas%
        \immediate\openout\arqEscreveSiglas=\jobname.losg%
        \firstSiglaUsefalse
    \fi
    \immediate\write\arqEscreveSiglas{#1 #2}%
    #2 (#1)%
}

\AtEndDocument{%
    \iffirstSiglaUse\else\immediate\closeout\arqEscreveSiglas\fi
}

\makeatletter
\newcommand{\leArquivo}{%
    \def\dados{}
    \newread\arqLeSiglas%
    \openin\arqLeSiglas=\jobname.losg%
    \loop\unless\ifeof\arqLeSiglas%
        \read\arqLeSiglas to \dados%
        \dados\par%
    \repeat%
    \closein\arqLeSiglas%
}

\begin{document}

\leArquivo

A \sigla{EPUSP}{Escola Politécnica da Universidade de Sao Paulo} é uma instituição de ensino ligada à \sigla{USP}{Universidade de Sao Paulo} e visa o ensino em engenharia. A entidade representativa dos engenheiros formado na EPUSP é responsabilidade da \sigla{AEP}{Associacao dos Engenheiros Politecnicos} que promove a integração entre ex-alunos.

\end{document}

答案是“!包 inputenc 错误:Unicode 字符 \u8:(某些内容)未设置为用于 LaTeX”

我阅读了 inputenc 文档,看到了一些使用 utf8 字符生成的 aux 文件,我意识到重音字符的正确表示是“\IeC{...}”,但我的输出文件并非如此。

我的输出文件是:

EPUSP Escola Politécnica da Universidade de Sao Paulo
USP Universidade de Sao Paulo
AEP Associacao dos Engenheiros Politecnicos

有人知道我做错了什么吗?

答案1

通过 LaTeX 的机制,通过定义的字符inputenc变得健壮\protect。但它们不能用于“移动参数”,例如,\write除非\protect在本地给出了适当的定义。使用\protected@writenot \immediate\write(如果您需要 \immediate那么您需要设置\protect“手动”,但通常对于索引,您不希望立即写入。

答案2

因为你基本上想逐字逐句地写,我建议

\immediate\write\stream{\unexpanded{...}}

以下是我修改您的文档的方式:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[portuges]{babel}

%%% Allocate a write stream and close it at end document
\newwrite\arqEscreveSiglas
\AtBeginDocument{
  \immediate\openout\arqEscreveSiglas=\jobname.losg
}
\AtEndDocument{%
  \immediate\closeout\arqEscreveSiglas
}

\newcommand{\sigla}[2]{%
  \immediate\write\arqEscreveSiglas{\unexpanded{#1 #2}}%
  #2 (#1)%
}

\newcommand{\leArquivo}{%
  \def\dados{}%
  \newread\arqLeSiglas
  \openin\arqLeSiglas=\jobname.losg
  \loop\unless\ifeof\arqLeSiglas
    \read\arqLeSiglas to \dados
    \dados\par
  \repeat
  \closein\arqLeSiglas
  \immediate\openout\arqEscreveSiglas=\jobname.losg
}

\begin{document}

\leArquivo

A \sigla{EPUSP}{Escola Politécnica da Universidade de Sao Paulo} é uma
instituição de ensino ligada à \sigla{USP}{Universidade de Sao Paulo}
e visa o ensino em engenharia. A entidade representativa dos
engenheiros formado na EPUSP é responsabilidade da
\sigla{AEP}{Associacao dos Engenheiros Politecnicos} que promove a
integração entre ex-alunos.

\end{document}

由于您想在读取完前一个文件后打开写入流,因此在读取完成后打开它会更容易。

相关内容