jobname,ifdefstring,IfSubStringInString,detokenize

jobname,ifdefstring,IfSubStringInString,detokenize

我的问题原本与 使用jobname来“传递参数”?

但这个问题似乎没有完整的答案。(我相信在深入了解这个问题的专家看来,这个问题已经解决了。)

查看其他一些相关帖子,

如何检查 LaTeX 文档的文件名是否包含字符串?

\jobname、字符代码和 \detokenize

我已经能够在很大程度上解决我原来的问题,\IfSubStringInString但不能使用\ifdefstring。请参阅下面的示例代码。

% run this with pdflatex -jobname=hello thissourcecode.tex
\documentclass{article}
\usepackage{etoolbox}
\usepackage{substr}
\begin{document}
jobname is: ``\jobname''.

% The following gives "true"
\IfSubStringInString{\detokenize{hello}}{\jobname}{substr true}{substr false}

% The following gives "false"
\ifdefstring{\detokenize{hello}}{\jobname}{etoolbox true}{etoolbox false}
\end{document}

解决方案\IfSubStringInString还不错,只是包中似乎没有包含精确匹配的命令。我也很乐意\ifdefstring使用\jobname

答案1

您可以使用etoolbox(以及最近发布的 LaTeX)来完成此操作。

但最好不要使用它;我提供了一个通用的字符串相等性比较和一个特定的用于比较的比较\jobname

\documentclass{article}
\usepackage{etoolbox}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\stringsequalTF}{mmmm}
 {
  \str_if_eq:eeTF { #1 } { #2 } { #3 } { #4 }
 }
\NewExpandableDocumentCommand{\stringisjobnameTF}{mmm}
 {
  \str_if_eq:nVTF { #1 } \c_sys_jobname_str { #2 } { #3 }
 }
\ExplSyntaxOff

\setlength{\parindent}{0pt} % just for the example

\begin{document}

jobname is: ``\texttt{\jobname}''

\section{With \texttt{etoolbox}}

\ExpandArgs{ee}\ifstrequal{\jobname}{\detokenize{hello}}{true}{false}

\ExpandArgs{ee}\ifstrequal{\jobname}{\detokenize{ryo}}{true}{false}

\section{Without \texttt{etoolbox}}

\subsection{With \texttt{\string\stringsequalTF}}

\stringsequalTF{\jobname}{hello}{true}{false}

\stringsequalTF{\jobname}{ryo}{true}{false}

\subsection{With \texttt{\string\stringisjobnameTF}}

\stringisjobnameTF{hello}{true}{false}

\stringisjobnameTF{ryo}{true}{false}

\end{document}

在此处输入图片描述

相关内容