我很好奇是否有办法将少量 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}