新版本命令评估/代码审查

新版本命令评估/代码审查

我还是新手 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

新的解决方案有缺点:

  1. 它具有更多依赖项:
\usepackage{xstring}
\usepackage{currfile}
  1. 它需要将“-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}

这是好的更新吗?此命令的新版本有什么缺陷吗?

相关内容