diff options
Diffstat (limited to 'info/symbols/comprehensive/source/makefakeutfsym')
-rwxr-xr-x | info/symbols/comprehensive/source/makefakeutfsym | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/info/symbols/comprehensive/source/makefakeutfsym b/info/symbols/comprehensive/source/makefakeutfsym new file mode 100755 index 0000000000..729b3546ea --- /dev/null +++ b/info/symbols/comprehensive/source/makefakeutfsym @@ -0,0 +1,127 @@ +#! /usr/bin/env python + +############################################## +# Convert each utfsym picture to a PDF file. # +# # +# Author: Scott Pakin <scott.clsl@pakin.org> # +############################################## + +import concurrent.futures +import glob +import os +import re +import subprocess +import sys + + +def kpsewhich(fname): + 'Find a filename in the TeX tree.' + proc = subprocess.run(['kpsewhich', fname], capture_output=True, + check=True, encoding='utf-8') + return proc.stdout.strip() + + +# Extract the package description from utfsym.sty. +desc_re = re.compile(r'\\ProvidesExplPackage\{utfsym\}(\{.*\})$') +sty = kpsewhich('utfsym.sty') +with open(sty) as r: + for ln in r: + match = desc_re.search(ln) + if match is not None: + desc = match[1] + break + +# Acquire a list of all defined symbols. +udir = os.path.dirname(kpsewhich('usym1F600.tikz')) +tikz_files = glob.glob(os.path.join(udir, '*.tikz')) +symbols = [os.path.splitext(os.path.basename(fn))[0] for fn in tikz_files] +symbols.sort(key=lambda s: int(s[4:], 16)) + +# Create a fakeutfsym.sty file. +with open('fakeutfsym.sty', 'w') as w: + w.write('''\ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This is a generated file. DO NOT EDIT. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +''') + w.write('''\ +\\NeedsTeXFormat{LaTeX2e} +\\ProvidesExplPackage{fakeutfsym}%s +\\RequirePackage{graphicx} + +\\NewDocumentCommand{\\usym}{m}{\\includegraphics{utfsym/usym#1}} +\\NewDocumentCommand{\\usymW}{m m}{\\includegraphics[width=#2]{utfsym/usym#1}} +\\NewDocumentCommand{\\usymH}{m m}{\\includegraphics[height=#2]{utfsym/usym#1}} + +\\endinput +''' % desc) + +# Create and switch to a utfsym subdirectory. +try: + os.mkdir('utfsym') +except FileExistsError: + pass +os.chdir('utfsym') + + +def run_and_return_output(cmd_line): + 'Run a command line and return its combined stdout + stderr.' + stdout = 'RUN: ' + ' '.join(cmd_line) + '\n' + proc = subprocess.run(cmd_line, check=True, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout += proc.stdout.decode('utf-8') + return stdout + + +# For speed, dump a LaTeX format file with utfsym preloaded. +with open('preloaded.tex', 'w') as w: + w.write(r''' +\documentclass{minimal} +\usepackage{utfsym} +\begin{document} +\end{document} +'''[1:]) +subprocess.run([ + 'pdflatex', + '--ini', + '&pdflatex', + 'mylatex.ltx', + 'preloaded.tex' +], + check=True) + + +def generate_graphic(sym): + 'Generate a PDF file for a given utfsym symbol.' + stdout = f'*** PROCESSING {sym} ***\n\n' + + # Create a LaTeX file. + stdout += f'CREATE: {sym}.tex\n' + with open(sym + '.tex', 'w') as w: + w.write(r''' +\documentclass{minimal} +\usepackage{utfsym} +\begin{document} +\usym{%s} +\end{document} +''' % sym[4:]) + + # Compile the LaTeX file to PDF. + stdout += run_and_return_output(['pdflatex', '&mylatex', sym + '.tex']) + + # Crop the PDF file. + stdout += run_and_return_output(['pdfcrop', sym + '.pdf']) + + # Overwrite the original PDF file with the cropped version. + stdout += f'RUN: mv {sym}-crop.pdf {sym}.pdf\n' + os.rename(f'{sym}-crop.pdf', f'{sym}.pdf') + + # Output the buffered output. + stdout += '\n' + print(stdout) + + +# Concurrently process all symbols. +with concurrent.futures.ProcessPoolExecutor() as executor: + executor.map(generate_graphic, symbols) |