![如何为我们机器上安装的每个 LaTeX 字体包编译相同的输入文件?](https://linux22.com/image/279687/%E5%A6%82%E4%BD%95%E4%B8%BA%E6%88%91%E4%BB%AC%E6%9C%BA%E5%99%A8%E4%B8%8A%E5%AE%89%E8%A3%85%E7%9A%84%E6%AF%8F%E4%B8%AA%20LaTeX%20%E5%AD%97%E4%BD%93%E5%8C%85%E7%BC%96%E8%AF%91%E7%9B%B8%E5%90%8C%E7%9A%84%E8%BE%93%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%9F.png)
受到我的问题的启发如何为每个可用的 Beamer 主题自动创建 PDF 演示文稿?,现在我想为我的机器上安装的每个可用的 LaTeX 字体包编译我的输入文件。
如下列出每个字体名称\foreach
似乎不是一个好主意,因为它不能容纳所有可用的软件包,并且它不是最新的。
% the file name of this code is inputfile.tex
% compile it with pdflatex -shell-escape inputfile.tex
\documentclass[preview,border=12pt,multi]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{template.tex}
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{\loadfont}
\usepackage{pgffor}
\usepackage{amsmath}
\usepackage{mathrsfs}
\begin{document}
\foreach \x in {1,...,26}{\char\numexpr\x+64\relax\char\numexpr\x+96\relax\space}
\begin{align*}
\sin (\alpha \pm\beta) &=\sin\alpha \cos \beta \pm \cos\alpha \sin\beta\\
\mathscr{L}\left\{f(t)\right\} &= F(s)\\
\vec{F} &= m\frac{\textrm{d}\vec{v}(t)}{\textrm{d}t}\\
\int_a^b f(x)\, \textrm{d}x &= F(b) -F(a)\\
\vec \nabla \cdot \vec \nabla \times A &= \vec\nabla \times \nabla U
\end{align*}
\end{document}
\end{filecontents*}
\usepackage{graphicx}
\usepackage{pgffor}
\def\dojob#1{\immediate\write18{pdflatex -jobname=template-#1 "\def\noexpand\loadfont{#1} \noexpand\input{template}"}}
\begin{document}
\foreach \x in {bera,palatino,mathpazo,helvet,libertine}
{%
\dojob{\x}%
\preview
\section{\x}
\includegraphics{template-\x}
\endpreview
}
\end{document}
使用此方法可以轻松列出所有已安装的软件包(列表不仅包括字体包,还包括其他包)如何将 TeX Live 上安装的软件包列表打印到文件?。但是,我不知道如何过滤列表并删除非字体包。
如何为我们机器上安装的每个 LaTeX 字体包编译相同的输入文件?
答案1
这是我的解决方案,假设您可以访问安装了 TeX 的 UNIX¹ 系统。
在项目的工作目录中
- 创建一个
main
子目录来保存您的文档的文件。 - 编辑文档的序言,使其包含声明
input{fontsetup}
。 - 对于您想要测试的每个字体包,创建一个子目录,其中包含一个
fontsetup.tex
负责设置您想要的字体的文件。 - 在您的目录项目中,创建一个
build.sh
您将运行以产生输出的 shell 脚本,如下所述。
该build.sh
脚本可能看起来像,我假设您的主文档文件是galley.tex
并且您的包是'lmodern mathpple'
#!/bin/sh
pkg_list='mathpple lmodern'
for pkg in "$pkg_list"; do
env TEXINPUTS="main:$pkg:." tex -jobname $pkg galley.tex
done
根据您的系统,您可以pkg_list
用以下方式替换分配
pkg_list=`find . -type d \( -name main -prune -o -print \)`
免去了您维护列表的麻烦。
现在您仍然需要为要测试的每个包准备目录,并更新变量。为了帮助您在项目目录中pkg_list
创建以下脚本:fontsetup.sh
#!/bin/sh
for pkg in "$@"; do
install -d $pkg
printf '\\usepackge{%s}\n' $pkg > $pkg/fontsetup.tex
done
给脚本赋予执行位并尝试一下
$ ./fontsetup.sh mathpple lmodern
$ ./build.sh
第一个命令为每个包创建一个目录和一个规范fontsetup.tex
文件。第二个命令处理每个包。
每个字体包都有不同的文件很好,因为它允许您添加特定于字体的自定义。
¹ 我的意思是FreeBSD当然!
答案2
我没有足够的声誉来发表评论,尽管这只是评论而不是答案。
也许,这个问题和答案会对你有帮助:我的盒子上安装了哪些字体?
请注意,一个答案指出,本页上的所有字体应该在完整的 LaTeX-Install 中可用。但如果您想使用一些系统字体,此列表可能不完整。
答案3
实际上,这应该使用一个简单的 shell 脚本或其他 Unix 工具来完成,这些脚本或工具会生成一个简单的包装文档,然后加载您的文本。但这里有一个更以 TeX 为中心的解决方案。它的好处是,您可以只使用一个 LaTeX 文档,而不需要通过编程生成或修改。
(La)TeX 的一个很少使用的功能是,它的参数可以是 TeX 命令序列,而不是文件名。因此,编写文档时,字体由宏指定,文档本身中未定义。然后每次调用都可以将宏定义为不同的字体。
该文件:
\documentclass{article}
\usepackage{\myfont}
\begin{document}
Hello, Marienplatz!
\end{document}
从 Unix、Windows 或 VM/CMS 命令行:
% pdflatex "\def\myfont{palatino}\input{handout.tex}"
% mv handout.pdf palatino.pdf
% pdflatex "\def\myfont{times}\input{handout.tex}"
% mv handout.pdf times.pdf
etc.
附录: 事实上,上述操作需要您手动了解并插入字体名称,因此这并不是您真正想要的。您只要求乳胶字体包,但你会满足于使用所有系统字体吗?这里有一个适用于 OS X 的小 bash 脚本,它将为所有已安装的 truetype 字体生成版本:
for F in /Library/Fonts/*.ttf
do
FONT=`basename "$F" .ttf`
xelatex "\def\myfont{$FONT}\input{handout.tex}"
mv handout.pdf "$FONT".pdf
done
如果有那么多学生,请重复.otf
和。(由于这使用了 XeLaTeX,因此用替换).ttc
\usepackage{\myfont}
\setmainfont{\myfont}
handout.tex
编辑2:
这是 Windows 版本,使用fc-list
以下命令这个问题列出可用的字体:
FOR /F %F IN ('fc-list :outline -f "%{family}\n"') DO
xelatex "\def\myfont{%F}\input{handout.tex}"; move handout.pdf %F.pdf
不客气。