我需要解析\jobname
以提取文件文件名中编码的一些元数据(例如信件的主题).tex
。文件名不限于 ASCII,可以是任何 UTF8 字符。特别是,我有很多文件的名称中带有德语变音符号。但是,编译:
% Änderungen.tex
\documentclass[]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
\jobname
\end{document}
收益为pdflatex
:
使用lualatex
或xelatex
输出都很好;但是,我更愿意使用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]
存储作业名称(带有正确的类别代码)\foo
。X
只是为了表明打印时没有添加空格。
终端将停止\show\foo
在
> \foo=macro:
->Änderungen.
l.20 \UTFjobname[\foo]\show\foo
笔记
自 2015 年 9 月起,常量\c_job_name_tl
已被删除并更改为\c_sys_jobname_str
。代码已相应更新。