这似乎是一个愚蠢的想法。它确实非常迂腐。我花了整个下午的时间试图弄清楚这一点。
背景
TeX 直播
我今天查看的所有引擎都在其-help
和man
页面中列出了单破折号标志。例如,pdftex -help
says-shell-escape
是解除束缚 的方式\write18
。但是,双破折号标志也可以使用,例如--shell-escape
also frees \write18
。
我浏览了一些源代码库,查看了标志的解析位置,但我对它们一无所知。一个很好的例子是Web2c
变更日志。它看起来像是-shell-escape
1997 年添加的。
7.0(1997 年 2 月 6 日)
如果
-shell-escape
或shell_escape
中texmf.cnf
启用,\write18{str}
则将 str 传递给system(3)
进行处理sh
。
十几年过去了,--shell-escape
似乎已经存在了一段时间了。
2009(针对 TeX Live 2009,2009 年 10 月 13 日)
--enable-write18
并被--disable-write18
接受为--shell-escape
和的同义词--no-shell-escape
,以与 MiKTeX 兼容。
麦金塔电脑
MacTeX 似乎使用双破折号标志。然而,同一新闻稿中提到,TeX Live 在 2010 年就使用了双破折号标志。
微特克斯
MiKTeX 似乎使用了双破折号一段时间。然而,查看旧代码需要比我想象的还要多的侦探工作。
问题
我有几个,但它们都紧密相关。
- 为什么要同时使用两者?是为了兼容性吗(这似乎是最明显的原因)?
- 为什么一开始会同时使用这两种语言?是风格上的差异,还是有技术原因(例如
getopts
无法处理长选项)? - 事情什么时候发生变化的?
如果您知道我可以在源代码库的哪个地方了解这些内容,我很乐意听听。我并不是想说哪个更好;它们都有效,所以都是正确的。我只是对这一切背后的历史感到好奇。
答案1
今天早上我没能追查到所有历史记录,但我记得最初 tex 没有选项。当添加选项时,例如tex -ini
替换旧的单独程序,initex
它们被添加了一个破折号。
posix 和 linux 建议使用两个破折号来表示多字母选项,并且这--help
应该适用于所有应用程序
https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html
由于没有冲突,web2c 选项处理已发生改变,现在在所有情况下都接受一个或两个破折号。
答案2
TeX live 中的 LuaTeX 解析命令行选项luainit.w
使用getopt_long_only
我们在文献中发现
获取opt_long_only()就好像获取opt_long(),但 '-' 以及 "--" 都可以表示长选项。
XeTeX 和 pdfTeX 在texmfmp.c
我相信。