如何自动检测 tex 文件的编码?

如何自动检测 tex 文件的编码?

我有一个自定义的.sty编码文件cp1251,它定义了\RequirePackage[cp1251]{inputenc}。我使用它以pdflatex相同的编码进行编译,但是当我尝试使用其他编码编译某个文件时,utf8我当然会得到错误。我的包如何自动检查文件编码并重新定义参数\RequirePackage[<current file encoding>]{inputenc}

简而言之,我需要类似

\if@CurrentFileEncoding=utf8
       \RequirePackage[utf8]{inputenc}
       \RequirePackage{literat}
\else
       \RequirePackage[cp1251]{inputenc}
       \RequirePackage{<someotherpackage>} 

答案1

您可以使用selinput;对于这种特殊情况,可以使用西里尔字母,以及一组受限制的编码来查找。

\documentclass{article}
\usepackage{selinput}
\SelectInputEncodingList{utf8,cp1251}
\SelectInputMappings{
  cyrd={д},
}

\begin{document}
\inputencodingname
\end{document}

如果文件采用 UTF-8 编码,则编译时将产生

utf8

如果采用 CP1251 编码,

cp1251

将会生产。

然而,您的问题有所不同,而且实际上无法解决。

如果你的包裹有,说

\renewcommand{\chaptername}{Глава}

并且以 CP1251 编码,那么在 UTF-8 编码的文档中使用此编码的方式,因为 TeX 仅在以下情况下使用输入编码:扩展宏. 当 TeX 存储定义时,这完全不相关。

在这种情况下,\chaptername将扩展为字符序列

<C3><EB><E0><E2><E0>

(每个<..>表示一个字符代码)的类别代码为 13,这在 UTF-8 编码的文档中无效。

你可以使用

\RequirePackage[utf8,cp1251]{inputenc}
\inputencoding{cp1251}

sergiokapone.sty文件中

\protected@edef\chaptername{Глава}

在代码中,这将使 LaTeX 扩展\chaptername

\IeC{\CYRG}\IeC{\cyrl}\IeC{\cyra}\IeC{\cyrv}\IeC{\cyra}

这与编码无关,主文档将使用

\usepackage{sergiokapone}
\inputencoding{utf8} % or cp1251

或者,可能selinput如之前所示。

但这不是我推荐的。最好的方法是让.sty文件编码独立;上面的内容\renewcommand应该是

\renewcommand{\chaptername}{\CYRG\cyrl\cyra\cyrv\cyra}

相关内容