在 TeX FAQ 中有一种方法可以测试是否jobname
等于某个值(比较职位名称)。简单测试的难点在于,\jobname
原始内容的 catcode 为 12,因此,为了测试是否为\jobname
,myfile
我们需要创建一个包含字符串myfile
但 catcode 为 12 的宏,并使用它来与进行比较\jobname
。
如果您控制测试,那么这一切都很好。但是如果您不控制测试怎么办?如果您想要将某个包中的某个测试\jobname
(或其中的一部分)传递给它,并且该测试针对的是 catcodes 11 的预定义单词,该怎么办。
是否有某种方法\meaning
可以将其内容转换为 catcode 11?
在编辑中添加:已要求提供一个可能的用途的示例。
\documentclass{beamer}
%\url{http://tex.stackexchange.com/q/117892/86}
\expandafter\includeonlylecture\expandafter{\jobname}
\begin{document}
\lecture{An Astonishing Result}{euclid}
\begin{frame}{Euclid's Astonishing Result}
\end{frame}
\lecture{A Boring Result}{pythagoras}
\begin{frame}{Pythagoras' Boring Result}
\end{frame}
\end{document}
目的是:
pdflatex -jobname euclide lectures.tex
和
pdflatex -jobname pythagoras lectures.tex
制作不同的讲座。
答案1
我不太明白这个问题;类别代码 12 正是用于避免类别代码和特殊字符出现问题。
您\scantokens
可以这样做:将以下代码保存为ncjob.tex
并运行它。
\documentclass{article}
\begingroup
\everyeof{\noexpand}
\endlinechar=-1
\xdef\normaljobname{\scantokens\expandafter{\jobname}}
\endgroup
\def\test{ncjob}
\ifx\test\normaljobname\typeout{SUCCESS}\else\typeout{FAILURE}\fi
\stop
成功
重要的提示这要求作业名称仅包含“安全字符”;~
文件名中的某些内容会导致其严重死亡。
一种可能更安全的方法是使用expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
\NewDocumentCommand{\definenormaljobname}{O{\normaljobname}}
{
\tl_set_rescan:NnV #1 { } \c_job_name_tl
}
\ExplSyntaxOff
\definenormaljobname
\def\test{nc~job}\show\normaljobname
\ifx\test\normaljobname\typeout{SUCCESS}\else\typeout{FAILURE}\fi
\stop
使用命令行测试
pdflatex -jobname 'nc~job' ncjob
这就是您的示例的管理方式;不要在从命令行传递的作业名称中使用特殊字符或空格(当然,也不要出现在讲座标签中)。
\documentclass{beamer}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
\NewDocumentCommand{\includelecturefromjobname}{}
{
\tl_set_rescan:NnV \l_tmpa_tl { } \c_job_name_tl
\exp_args:NV \includeonlylecture \l_tmpa_tl
}
\ExplSyntaxOff
\includelecturefromjobname
\begin{document}
\lecture{An Astonishing Result}{euclid}
\begin{frame}{Euclid's Astonishing Result}
\end{frame}
\lecture{A Boring Result}{pythagoras}
\begin{frame}{Pythagoras' Boring Result}
\end{frame}
笔记
自 2015 年 9 月起,\c_job_name_tl
应使用
\c_sys_jobname_str
答案2
这允许文件名包含特殊字符,并且仍然进行比较(在这种情况下,所有内容都转换为 catcode 12 以进行比较)
\documentclass{article}
\usepackage{ifthen}
\def\display#1{\detokenize\expandafter{#1}}
\def\comparenames#1{%
\ifthenelse{\equal{\display{#1}}{\display{\comparetest}}}{T}{F}}
\begin{document}
\def\comparetest{myfile}
\def\jbnm{myfile}
\comparenames{\jbnm}
\def\jbnm{\$&o)-}
\comparenames{\jbnm}
\end{document}
答案3
将此文件保存为 cxviiviiicxcii.tex:
\documentclass{article}
% Save this file as cxviiviiicxcii.tex
\begin{document}
\def\alltoletter {%
\count 255 0
\loop
\catcode\count255 11
\ifnum\count 255 < 255 \advance \count 255 1 \repeat }
\def\convert #1\to #2{%
\begingroup
\everyeof{\noexpand}%
\endlinechar -1
\alltoletter
\edef\x{\scantokens\expandafter{#1}}%
% earlier silly stuff (sorry): \expandafter\expandafter\expandafter\endgroup
\expandafter\endgroup
\expandafter\def\expandafter #2\expandafter{\x}%
}%
\def\myname {cxviiviiicxcii}%
\convert\jobname\to\jobnameconverted
converted: \ifx\myname\jobnameconverted EQUAL\else UNEQUAL\fi
unconverted: \ifx\myname\jobname EQUAL\else UNEQUAL\fi
\begingroup
\escapechar -1
\xdef\testtwoA {\string\abcdef}
\endgroup
\convert\testtwoA\to\testtwoAconverted
\def\testtwoB {abcdef}
converted: \ifx\testtwoB\testtwoAconverted EQUAL\else UNEQUAL\fi
unconverted: \ifx\testtwoB\testtwoA EQUAL\else UNEQUAL\fi
\end{document}