我经常需要检查像“20pt + 2 cm”这样的长度表达式会解析成什么——当然,我宁愿在命令行/shell/终端上快速做一些事情,而不是\documentclass{article} ...
在文件中输入并在其上运行 Latex。
那里有类似的东西吗?
答案1
$ pdftex '\relax\showthe\dimexpr20pt + 2 cm\relax\bye'
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=pdftex)
restricted \write18 enabled.
entering extended mode
> 76.9055pt.
引用'
假定为 bash 语法,其他命令行可能需要不同的引号,或者不需要引号。
答案2
嗯,可能有;搜索texcalc
返回结果:CTAN:texcalc来自 1988 年(带有二进制.ins
文件!);还有zem/texcalc · GitHub这是一个 Python 计算器,您可以通过 -shell-escape 在 Latex 文档中使用(并且iTunes 上的 App Store 上的 TexCalc,它“将纱线单位从 SI 转换为英美单位,反之亦然”。
但是,我想介绍一些其他的东西:我很确定几十年前有人在 comp.text.tex 上已经做过这个了 - 但我最近才有这个想法,而且我很惊讶它竟然可以起作用。:)
基本上,在这里我们将使用 *nix shebang 功能,制作一个可执行的 Latex 脚本(shebang 中有实际的可执行 Latex)。
首先回想一下:如果脚本/path/to/foo
以 开头#!/bin/bash
,则执行/path/to/foo arg1 arg2
相当于执行/bin/bash /path/too/foo arg1 arg2
。如果 shebang 行是#!/bin/bash -ex
,则执行相当于执行/bin/bash -ex /path/too/foo arg1 arg2
。此功能由内核管理。.因此,如果我们有如下一行:
#!/path/to/pdflatex "\catcode`\#=14\batchmode\gdef\cmd{\gdef\mcmd}\gdef\e{\input"
...我们用(注意单引号字符,因此 shell 不会解释反斜杠)进行调用:
./script.tex '} ___SOMETHING___ \e'
... 最终的调用结果为:
/path/to/pdflatex "\catcode`\#=14\batchmode\gdef\cmd{\gdef\mcmd}\gdef\e{\input" ./script.tex '} ___SOMETHING___ \e'
...或者只是参数pdflatex
看到,解决为:
\catcode`\#=14%
\batchmode% go silent here
\gdef\cmd{\gdef\mcmd}%
\gdef\e{\input ./script.tex } %
___SOMETHING___ %
\e % ... which is \input ./script.tex
因此,我们将让 Latex 重新读取script.tex
- 但跳过 shebang 字符(数字符号 / 井号 / 尖音符),因此不是崩溃——因为我们及时将其 catcode 更改为“注释”。然后,一旦进入脚本,我们就可以恢复该 catcode 并执行一些操作。唯一的麻烦是您必须使用 format 中的参数} __WHATEVER__ \e
,以及一些将实际命令传播到 Latex 的技术。天哪,我现在感觉自己就像一个 80 年代的黑客:)
因此,下面是一个名为的脚本cmdcalc.tex
(很好,我避免了texcalc
歧义:)
),它基本上与一起工作pgfmath
,并允许您执行如下操作:
$ ./cmdcalc.tex '} \cmd{ \pgfmathparse{20pt+2cm} } \e'
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011)
restricted \write18 enabled.
entering extended mode
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, lo
aded.
RESULT: '76.9055'
(for command: 'macro:-> \pgfmathparse {20pt+2cm} ')
或者:
$ ./cmdcalc.tex "}\
\\cmd{\
\\pgfmathparse{20pt+2cm}\
\\typeout{\
\\converttou{cm}{\\pgfmathresult pt}\
}\
}\
\\e"
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011)
restricted \write18 enabled.
entering extended mode
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, lo
aded.
2.70293cm
RESULT: '76.9055'
(for command: 'macro:-> \pgfmathparse {20pt+2cm} \typeout { \converttou {cm}{\
pgfmathresult pt} } ')
(是的,我也希望能够摆脱多余的宣传信息;但我可以只接受第一个)。
基本上,您将代码放在\cmd{ }
命令参数分隔符内} \e
- 基本上:} \cmd{ YOUR CODE HERE} \e
;您可以使用 pgfmath 表达式;\pgfmathresult
会自动打印,否则您必须\typeout
自己动手。
无论如何 - 我相信这可以做得更好,不幸的是我没有时间;所以我想我会在我记得的时候发布它:)
这里是脚本(当然,确保您已将您的实际路径放入pdflatex
shebang中 - 并且您已使其chmod +x cmdcalc.tex
在您的shell中可执行):
cmdcalc.tex
:
#!/path/to/texlive/2011/bin/i386-linux/pdflatex "\catcode`\#=14\batchmode\gdef\cmd{\gdef\mcmd}\gdef\e{\input"
% cmdcalc.tex; copyleft sdaau, 2014 / LPPL, GPL, or whatever suitable :)
% at entry, shebang already did \make#comment
% now that we have entered here, restore (\make#parameter)
\catcode`\#=6\relax
% enable messages here, if we need to debug package loading
% \errorstopmode
% "preamble" - load packages;
% since we haven't begun{document} yet,
% should use \RequirePackage/\input:
% \makeatletter
\input pgfutil-common.tex
\input pgfmathutil.code.tex
% \makeatother
\RequirePackage{pgfkeys}
\RequirePackage{pgfmath}
% set a debug flag, if needed, here:
% (if not wanted, simply keep commented=undefined)
% \def\dbg{1}
\ifx\dbg\undefined\else%
\RequirePackage{trace}% debug
\fi
% some Latex utility functions/macros:
%
% http://tex.stackexchange.com/a/8337/2595
\makeatletter
\def\convertto#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1}
% with units at end:
\def\converttou#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1 #1}
\newcommand{\gettikzcmxy}[3]{%
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\global\edef#2{\convertto{cm}{\the\pgf@x}}%
\global\edef#3{\convertto{cm}{\the\pgf@y}}%
\typeout{ gettikzcmxy: x \the\pgf@x #2 cm, y \the\pgf@y #3 cm}
}
\makeatother
% initialize \pgfmathresult, so it's not "! Undefined control sequence."
\pgfmathparse{0}
% stop the quiet batchmode, and halt on errors
% (if we want terminal interaction upon error)
% \errorstopmode
% % (or)
% stop the quiet batchmode, and just report errors and exit
\scrollmode
% run the set \cmd{} by user:
% %\expandafter\edef\expandafter\mrescmd{\mcmd} % bad!
% just run directly:
% \ifx\dbg\empty\else\traceon\fi% (if debug)
\ifx\mcmd\undefined%
\typeout{The \string\cmd is undefined!}
\else%
\ifx\dbg\undefined\else\traceon\fi%
\mcmd%
\ifx\dbg\undefined\else\traceoff\fi%
\fi%
% convenience result variable - \pmr (short for \pgfmathresult);
% check it after running of command:
% (do not handle \ifx\pmr\empty - maybe it's a valid outcome)
\ifx\pmr\undefined%
\let\pmr\pgfmathresult%
\fi
% print out \pg
\typeout{^^J RESULT: '\pmr' }
\typeout{ (for command: '\meaning\mcmd')}
% go silent again:
\batchmode
% forced exit:
\stop
% other possibilities: with luatex:
% \directlua0{io.stderr:write("Error: what do you thing you are doing^^J")}
% we don't need to begin document; we've already exited :)
% \begin{document}
答案3
从终端来看,这实际上非常简单:
> tex
** \relax
* \newdimen\calc
* \calc 20pt
* \advance \calc 2cm
* \showthe\calc
> 76.9055pt.