是否可以在命令行调用 latex 宏以返回字符串而不是创建文档?

是否可以在命令行调用 latex 宏以返回字符串而不是创建文档?

我很好奇是否有办法将少量 LaTeX 代码传递给命令行中的编译器并返回与变量或长度对应的字符串。

例如我想传递这个代码

\usepackage{calc}
\def\contnt{\tt{I wish I knew how much space was occupied by this string when typeset...}
\settowidth{\contntwdth}{\contnt}

我想指出我所追求的字符串输出是内容的宽度,例如

\the\contntwdth

非常感谢您的任何建议。

答案1

texdef我编写的工具可用于显示宏的定义以及维度和其他寄存器的值。它还允许在-b打印定义/值之前()和之后添加任意其他代码。

您的例子是(代码已重构):

$ texdef -t latex  -p calc -b '\newdimen\mydim \settowidth{\mydim}{\texttt{I wish I knew how much space was occupied by this string when typeset...}}' -v mydim

\the\mydim:
377.9967pt

如果需要,可以编写一个包装脚本,将实际文本插入到该位置并删除输出中不需要的行。

答案2

这是一个简单的 Bash 脚本,比如getdim

#!/bin/bash
latex << EOF | sed -n -e '/^\*\*\*\*/s///p'
\documentclass{article}
\nofiles
\begin{document}
\settowidth{\dimen0}{\ttfamily $1}\typeout{***\the\dimen0}
\stop
EOF

如果你跑

bash getdim "test of script"

您将获得以下输出

73.49936pt

(感谢 Marc van Dongen 建议改进使用sed。)

答案3

您可以使用\immediate\write18输出长度。下面的 MWE 得出:

内容宽度为377.9967pt。

相同的代码可用于评估不同字符串的长度。将以下代码保存为GetLength.tex,然后从命令行运行它:

pdflatex -shell-escape "\def\contnt{\tt{Here is a different string}}\input{GetLength.tex}"  | grep "content width"

产量:

内容宽度为136.49881pt。

代码:

\ifdefined\contnt
\else
    \def\contnt{\texttt{I wish I knew how much space was occupied by this string when typeset...}}
\fi

\documentclass{article}

\newlength{\contntwdth}
\settowidth{\contntwdth}{\contnt}
\begin{document}
    \immediate\write18{echo ""; echo "The content width is \the\contntwdth."}
\end{document}

答案4

我不清楚你到底想要什么。不过,这里有一个带有保存箱的解决方案:

\documentclass{article}
\newsavebox\TBox
\newlength\TLength
\def\contnt#1{\savebox\TBox{#1}\setlength\TLength{\wd\TBox}}

\begin{document}

\contnt{\ttfamily I wish I knew how much space was occupied by this string when typeset \ldots}
The contents has a width of \the\TLength

\end{document}

在此处输入图片描述

相关内容