更改 currfile 中的路径分隔符

更改 currfile 中的路径分隔符

如何将路径分隔符从 更改\/

在此处输入图片描述

我在 Windows 上使用 MikteX。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[abspath]{currfile}

\begin{document}

Absolute directory: \texttt{\currfileabsdir}

Absolute path: \texttt{\currfileabspath}
 
\end{document}

编辑:我正在寻找currfileabsdir使用\input{}

答案1

如果您希望更改宏的定义,\currfileabsdir 以便将类别 12(其他)的显式反斜杠字符替换为类别 12(其他)的(正)斜杠字符,您可以尝试如下操作:

\documentclass{article}
\usepackage[abspath]{currfile}

\ExplSyntaxOn
\cs_set:Npn \ReplaceBackslashesWithForwardSlashesInMacro #1
{
  \exp_args:Nno \use:n { \str_set:Nn \l_tmpa_str} {#1} 
  \regex_replace_all:nnN{\\}{/} \l_tmpa_str
  \exp_args:NnV \use:n {\cs_gset:Npn #1 } \l_tmpa_str
}
\ExplSyntaxOff

\begin{document}

Before patching \verb|\currfileabsdir|:

\texttt{\currfileabsdir}

\ReplaceBackslashesWithForwardSlashesInMacro{\currfileabsdir}

After patching \verb|\currfileabsdir|:

\texttt{\currfileabsdir}

\bigskip\hrule\bigskip

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Let's define some other macro whose expansion contains backslashes:
\begingroup
\catcode`\/=0
\catcode`\\=12
/gdef/SomeMacroWithBackslashes{\home\knoppix\Desktop\Zu Sichern\LaTeX Code\}
/endgroup
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Before patching \verb|\SomeMacroWithBackslashes|:

\texttt{\SomeMacroWithBackslashes}

\ReplaceBackslashesWithForwardSlashesInMacro{\SomeMacroWithBackslashes}

After patching \verb|\SomeMacroWithBackslashes|:

\texttt{\SomeMacroWithBackslashes}

\end{document}

在此处输入图片描述

您说您在 Windows 上使用 MiKTeX - 因此我怀疑斜杠和反斜杠的混合是导致您出现问题的唯一原因:

  1. Microsoft .NET 文章“Windows 系统上的文件路径格式”的“规范化分隔符”部分,网址:https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats,说道:

    “所有正斜杠 ( /) 都将转换为标准 Windows 分隔符,即反斜杠 ( \)。如果存在它们,则前两个斜杠后面的一系列斜杠将折叠为单个斜杠。”

    因此,在最新的 Windows 平台上,在属于 Windows 高级程序员接口的例程方面,许多情况下都可以混合使用斜杠和反斜杠。

    但我不知道 LaTeX 的用于解析/分割目录路径和文件名的宏/例程如何处理反斜杠...... (过去我曾经深入研究过这些细节,但随着时间的推移,很多事情都发生了变化,现在我有点厌倦让自己跟上时代了。当我真的需要了解当前的技术水平时,我会研究众多文献中的哪些实际上提供了信息并尝试查找 - 这里是带有几个链接的列表: Kpathsea 手册源2e.pdf源3.pdf界面3.pdf电子书/来源tex.web/计算机与排版 B 卷,TeX:程序总溶解固体e-TeX 手册XeTeX 参考指南XeTeX 伴侣LuaTeX 参考手册pdfTeX 用户手册ISO 32000(PDF)Web2C 手册xparse-手册MiKTeX 手册TeX Live 指南 

    我之所以写“很多情况”,是因为在某些 Windows 平台上,斜杠和反斜杠的混合使用不起作用。例如,我在 MS-DOS/Windows 3.1、Windows 95 和 Windows 98 等旧版平台的命令提示符上遇到了问题。例如,Chris Hoffman 在文章“为什么 Windows 使用反斜杠而其他一切都使用正斜杠”的“这有什么关系?”部分中提到,网址:https://www.howtogeek.com/181774/why-windows-uses-backslashes-and-everything-else-uses-forward-slashes/,该更新于 2018 年 7 月 31 日,其中指出“打开”对话框中的路径如果使用斜杠而不是反斜杠则不起作用。该文章附带了一张很好的屏幕截图,显示了在 Windows 7 计算机上使用此对话框时错误消息“文件名无效”是如何显示的。

  2. “4 绝对路径”一节currfile 软件包手册说:

    宏定义中的信息\currfileabsdir是从文件中检索的\jobname.fls
    如果文件\jobname.fls不可读在 LaTeX 运行期间, 的扩展\currfileabsdir会产生空值。
    为了\jobname.fls创建文件,需要使用编译器选项 调用 TeX 引擎-recorder

    然而,MiKTeX 还有另一个特点:\jobname.fls在当前 LaTeX 运行中使用 MiKTeX 时,会从上次 LaTeX 运行期间创建的文件中检索信息,然后再销毁该文件并重新创建。

    这意味着:在第一次运行 LaTeX 时,没有\jobname.fls来自前一次运行的文件可供读取。因此在 MiKTeX 中第一次运行 LaTeX 时,扩展\currfileabsdir会产生空值,因此在 MiKTeX 中第一次运行 LaTeX 时 \input{\currfileabsdir-AnotherFile}就像\input{-AnotherFile}。这种情况可能是问题的根源。

因此,与其用(正)斜杠替换反斜杠,不如需要一个例程来找出当前的 latex 运行是否是第一个 latex 运行,并在这种情况下为 的定义提供默认值\currfileabsdir。这可以通过例如将定义宏的指令写入 .aux 文件并检查所讨论的宏是否已定义来完成:在第一个 LaTeX 运行期间,还没有 .aux 文件,因此无法执行来自 .aux 文件的宏定义指令。在后续的 LaTeX 运行中,将执行指令并定义宏。

或者检查的扩展是否\currfileabsdir产生空,如果是这种情况,\currfileabsdir用一些默认值覆盖等的空定义也可能是一个可行的选择。

另一种方法是在开始时(甚至在之前)检查\documentclass是否\IfFileExists已经\jobname.fls存在且可供读取,并相应地设置标志。在序言中,如果相应地设置了标志,则使用\currfileabsdir某些默认值覆盖 etc 的空定义。

答案2

这是你想要的吗?

\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \path_set_format:n #1
{
  \str_set:Nn \l_tmpa_str{#1} % #1: path  
  old:~\str_use:N \l_tmpa_str\par 
  \regex_replace_all:nnN{\\}{/} \l_tmpa_str
  new:~\str_use:N \l_tmpa_str
}
\path_set_format:n{C:\User\username\Desktop\latex}
\ExplSyntaxOff
\end{document}

在此处输入图片描述

相关内容