我还是新手 Latex 用户,因此我需要高级用户的帮助来弄清楚宏的限制及其缺陷
先决条件:
我需要从其路径中提取文件名,并且找到了这个解决方案:https://tex.stackexchange.com/a/325052/272637. 但不支持将命令作为参数传递(ae \filename{\mycomm{param}}
)。
如果我调用会发生什么\filename{\mycomm{param}}
?假设\mycomm{param}
定义为
% NormalTeXSyntaxON
\def\setcase#1 {\expandafter\def\csname col:#1\endcsname}
\def\mycomm#1{\expandafter\ifx\csname col:#1\endcsname\relax \coldefault
\else \csname col:#1\endcsname\fi}
\def\coldefault {example/path.l}
% NormalTeXSyntaxOff
并且 \filename 在解决方案中定义如下:
\makeatletter
\DeclareRobustCommand{\filename}[1]{%
\begingroup
% \lstname seems to change hyphens into \textendash
\def\textendash{-}%
\filename@parse{#1}%
\edef\filename@base{\detokenize\expandafter{\filename@base}}%
\texttt{\filename@base.\filename@ext}%
\endgroup
}
\makeatother
- 实际结果:
filename{\mycomm{param}}
打印example/path.l
- 预期结果:
path.l
建议更新:
我添加了将命令作为参数传递的支持,并尝试使此功能跨平台。我还添加了对可选第一个参数的支持(即我可以调用它\filname[\bfseries]{path}
来使路径加粗)。
新定义:
\newcommand{\runtimeFsep}{/}
\newcommand{\updateRuntimeFsep}{\IfSubStr{\currfileabsdir}{/}{}{\renewcommand{\runtimeFsep}{\backslash}}}
\updateRuntimeFsep
\makeatletter
\DeclareRobustCommand{\filename}[2][]{%
\begingroup
% \lstname seems to change hyphens into \textendash
\def\textendash{-}%
\filename@parse{#2}%
\IfSubStr{\filename@base}{\runtimeFsep}{\filename@parse{\filename@base}}{}%
\edef\filename@base{\detokenize\expandafter{\filename@base}}%
#1{\filename@base.\filename@ext}%
\endgroup
}
\makeatother
新的解决方案有缺点:
- 它具有更多依赖项:
\usepackage{xstring}
\usepackage{currfile}
- 它需要将“-recorder”选项传递给 LaTeX 编译器,因为如果没有它,currfile 就无法工作。
旧命令的最小工作示例:
\documentclass{letter}
% NormalTeXSyntaxON
\def\setcase#1 {\expandafter\def\csname col:#1\endcsname}
\def\mycomm#1{\expandafter\ifx\csname col:#1\endcsname\relax \coldefault
\else \csname col:#1\endcsname\fi}
\def\coldefault {code/taskN.cpp}
% NormalTeXSyntaxOff
\makeatletter
\DeclareRobustCommand{\filename}[1]{%
\begingroup
% \lstname seems to change hyphens into \textendash
\def\textendash{-}%
\filename@parse{#1}%
\edef\filename@base{\detokenize\expandafter{\filename@base}}%
\texttt{\filename@base.\filename@ext}%
\endgroup
}
\makeatother
\begin{document}
\filename{\mycomm{a}}
\end{document}
新版本命令的最小工作示例:
\documentclass{article}
\usepackage{xstring}
\usepackage{currfile}
% NormalTeXSyntaxON
\def\setcase#1 {\expandafter\def\csname col:#1\endcsname}
\def\mycomm#1{\expandafter\ifx\csname col:#1\endcsname\relax \coldefault
\else \csname col:#1\endcsname\fi}
\def\coldefault {code/taskN.cpp}
% NormalTeXSyntaxOff
\newcommand{\runtimeFsep}{/}
\newcommand{\updateRuntimeFsep}{\IfSubStr{\currfileabsdir}{/}{}{\renewcommand{\runtimeFsep}{\backslash}}}
\updateRuntimeFsep
\makeatletter
\DeclareRobustCommand{\filename}[2][]{%
\begingroup
% \lstname seems to change hyphens into \textendash
\def\textendash{-}%
\filename@parse{#2}%
\IfSubStr{\filename@base}{\runtimeFsep}{\filename@parse{\filename@base}}{}%
\edef\filename@base{\detokenize\expandafter{\filename@base}}%
#1{\filename@base.\filename@ext}%
\endgroup
}
\makeatother
\begin{document}
\filename{\mycomm{a}}
\end{document}
这是好的更新吗?此命令的新版本有什么缺陷吗?