\jobname 中非 ASCII 字符(变音符号)的编码

\jobname 中非 ASCII 字符(变音符号)的编码

我需要解析\jobname以提取文件文件名中编码的一些元数据(例如信件的主题).tex。文件名不限于 ASCII,可以是任何 UTF8 字符。特别是,我有很多文件的名称中带有德语变音符号。但是,编译:

% Änderungen.tex
\documentclass[]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}
  \jobname
\end{document}

收益为pdflatex

在此处输入图片描述

使用lualatexxelatex输出都很好;但是,我更愿意使用pdflatex。那么 实际上是怎样\jobname编码的,我该如何转换它呢?

答案1

如果你只需要打印作业名称,那么

\scantokens\expandafter{\jobname\noexpand}

就足够了。问题是 扩展中的所有字符\jobname都有类别代码 12,因此它们无法以正确的方式解释为打印。\scantokens我们让 TeX 重新读取它们,但首先我们需要扩展\jobname。最后一个\noexpand是为了避免末尾出现虚假空格。

如果您想将“重新标记的”名称存储在控制序列中,那么使用 LaTeX3 更容易:

\documentclass[]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\UTFjobname}{o}
 {
  \tl_set_rescan:NnV \l_tmpa_tl { } \c_sys_jobname_str
  \IfNoValueTF{#1}
   { \tl_use:N \l_tmpa_tl }
   { \tl_set_eq:NN #1 \l_tmpa_tl }
 }
\cs_generate_variant:Nn \tl_set_rescan:Nnn {NnV}
\ExplSyntaxOff

\begin{document}
\scantokens\expandafter{\jobname\noexpand}X

\UTFjobname X

\UTFjobname[\foo]\show\foo

\end{document}

\UTFjobname使用 打印作业名称,使用\UTFjobname[\foo]存储作业名称(带有正确的类别代码)\fooX只是为了表明打印时没有添加空格。

在此处输入图片描述

终端将停止\show\foo

> \foo=macro:
->Änderungen.
l.20 \UTFjobname[\foo]\show\foo

笔记

自 2015 年 9 月起,常量\c_job_name_tl已被删除并更改为\c_sys_jobname_str。代码已相应更新。

相关内容