我可以将字符串转换为 catcode 11 吗?

我可以将字符串转换为 catcode 11 吗?

在 TeX FAQ 中有一种方法可以测试是否jobname等于某个值(比较职位名称)。简单测试的难点在于,\jobname原始内容的 catcode 为 12,因此,为了测试是否为\jobnamemyfile我们需要创建一个包含字符串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}

图片

相关内容