命令行 Latex 计算器?

命令行 Latex 计算器?

我经常需要检查像“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自己动手。

无论如何 - 我相信这可以做得更好,不幸的是我没有时间;所以我想我会在我记得的时候发布它:)这里是脚本(当然,确保您已将您的实际路径放入pdflatexshebang中 - 并且您已使其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.

相关内容