如何为我们机器上安装的每个 LaTeX 字体包编译相同的输入文件?

如何为我们机器上安装的每个 LaTeX 字体包编译相同的输入文件?

在此处输入图片描述

受到我的问题的启发如何为每个可用的 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¹ 系统。

在项目的工作目录中

  1. 创建一个main子目录来保存您的文档的文件。
  2. 编辑文档的序言,使其包含声明input{fontsetup}
  3. 对于您想要测试的每个字体包,创建一个子目录,其中包含一个fontsetup.tex负责设置您想要的字体的文件。
  4. 在您的目录项目中,创建一个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

不客气。

相关内容