我不知道这里是不是该问这个问题的地方,但我不知道还有什么地方……
所以我刚刚完成了我的第一个版本稳健外化库(在进行重要的重写之后,非常感谢这里所有人的帮助),但在将其推送到 CTAN 之前,我想检查它是否与 Windows 兼容(我需要-shell-escape
并且我真的不知道我使用的命令是否真的是跨平台的,它们应该是但谁知道 Windows 如何反应)。
有人能帮我测试一下吗,因为我身边没有窗户?测试步骤很简单:
$ git clone https://github.com/leo-colisson/robust-externalize
$ cd robust-externalize/doc
然后,要禁用代码构建bash
(在 Windows 上不可用),只需doc/robust-externalize.tex
在文件后添加以下内容进行修改\begin{document}
:
\robExtConfigure{
% bash code will not be compiled (bash does not exist on windows)
bash/.append style={
disable externalization
},
}
并使用以下命令编译文件:
$ pdflatex -shell-escape robust-externalize.tex
$ pdflatex -shell-escape robust-externalize.tex
(如果您害怕-shell-escape
,您也可以添加一行 |启用手动模式,| 并\robExtConfigure
手动运行 |JOBNAME-robExt-compile-missing-figures.sh| 中的命令,但部分目标是检查是否-shell-escape
按预期工作)
如果没有错误,并且代码生成了robust-externalize.pdf
类似这样的文件https://raw.githubusercontent.com/leo-colisson/robust-externalize/master/doc/robust-externalize.pdf那么一切都很好!您可以在此处报告,也可以在github 问题为此而创建!谢谢!
答案1
虽然拥有一种强大的方法来外部化图像和其他内容会很棒,但请重新考虑将其推向当前状态的 CTAN。expl3
代码的清晰度要求人们遵守命名约定并使用包含(而不是排除)冲突检查的函数。
\cs_set:Nn \str_set_hash_robust:Nn % No!
您真的、真的、真的不应该这样做。这不仅是str
现有模块的名称,而且是内核模块的名称。您不是将其添加为负责该模块的团队成员,因此您应该选择自己的模块名称,并且您创建的所有函数和变量都应以该模块名称为前缀。
set
除非你之前已经做过,否则你也不应该这么做new
。而且你绝对不应该用一个理应属于现有模块的名称来做这件事str
。
\str_set:Nn {#1} {#2} % No!
是错误的,类似结构也是一样。只要有N
,就不应该有括号。所以
\str_set:Nn #1 {#2}
您的变量系统地被错误命名,因为它们都省略了应该表明其变量类型的后缀。
\str_new:N \l_robExt_template % No!
例如,格式不正确,应该
\str_new:N \l_robExt_template_str
expl3
对于您创建的每个变量都是如此。
请注意,您还将此变量声明为适合公共使用。这意味着用户可以合理地期望更新考虑到他们可能正在使用的事实\l_robExt_currentCompilationCommand
。如果您准备支持这一点,那么这很好,但对于一个包来说,不使用任何内部函数或变量是有点不寻常的。
您正在打开至少 3 个新的写入。对于一个作用相对有限的包来说,这是一大笔资源。TeX 最多允许 16 次写入。您的包几乎需要其中的 20%。(LuaTeX 允许 128 次,所以不用担心。)这可以通过 来解决morewrites
,但我不记得使用过任何包会将自己扩展到 3 次(一个仅用于临时写入的包?)。
如果命令、函数或变量不应由最终用户调用,请适当命名它们。对于expl3
,指导很明确。对于 2e 命令,情况定义得不太明确,但\robExt@...
会标记出该命令不适用于外部使用的可能性。不要依赖注释或文档来传达这一点。
尽管您声明了局部变量,但您似乎并没有充分利用分组。也许这是必要的,并且是设计使然,但如果不是,那么值得看看您是否可以在本地做更多的事情。
答案2
实际上,我设法运行了一个旧的 Windows VM,并且它可以运行!