summaryrefslogtreecommitdiff
path: root/info/symbols/comprehensive/source/makefakefigchild
diff options
context:
space:
mode:
Diffstat (limited to 'info/symbols/comprehensive/source/makefakefigchild')
-rwxr-xr-xinfo/symbols/comprehensive/source/makefakefigchild152
1 files changed, 152 insertions, 0 deletions
diff --git a/info/symbols/comprehensive/source/makefakefigchild b/info/symbols/comprehensive/source/makefakefigchild
new file mode 100755
index 0000000000..b2a12c9912
--- /dev/null
+++ b/info/symbols/comprehensive/source/makefakefigchild
@@ -0,0 +1,152 @@
+#! /usr/bin/env python
+
+################################################
+# Convert each figchild picture to a PDF file. #
+# #
+# Author: Scott Pakin <scott.clsl@pakin.org> #
+################################################
+
+import concurrent.futures
+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 all commands defined by figchild.sty and the package description.
+desc = None
+commands = []
+newcmd_re = re.compile(r'^\\newcommand{\\(fc\w+)\}')
+desc_re = re.compile(r'\\ProvidesPackage\{figchild\}\[(.*?)\]')
+sty = kpsewhich('figchild.sty')
+with open(sty) as r:
+ for ln in r:
+ # Extract the package description.
+ if desc is None:
+ match = desc_re.search(ln)
+ if match is not None:
+ desc = match[1]
+
+ # Extract a command.
+ match = newcmd_re.search(ln)
+ if match is None:
+ continue
+ if match[1] != 'fcAlligatorB': # Undocumented and broken
+ commands.append(match[1])
+commands.sort(key=lambda s: s.lower())
+
+# Create a fakefigchild.sty file.
+with open('fakefigchild.sty', 'w') as w:
+ w.write('''\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is a generated file. DO NOT EDIT. %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+''')
+ w.write('''\
+\\NeedsTeXFormat{LaTeX2e}
+\\ProvidesPackage{fakefigchild}[%s]
+\\RequirePackage{graphicx}
+
+''' % desc)
+ for cmd in commands:
+ ht = 20
+ if cmd == 'fcPencil':
+ # Special case for \fcPencil, which is abnormally wide and short.
+ ht = 5
+ w.write('\\DeclareRobustCommand{\\%s}{%%\n' % cmd)
+ w.write(' \\includegraphics[height=%dpt,keepaspectratio]'
+ '{figchild/%s}%%\n' % (ht, cmd))
+ w.write('}\n')
+ w.write('\n')
+ w.write('\\endinput\n')
+
+# Create and switch to a figchild subdirectory.
+try:
+ os.mkdir('figchild')
+except FileExistsError:
+ pass
+os.chdir('figchild')
+
+# For speed, dump a LaTeX format file with figchild preloaded.
+with open('preloaded.tex', 'w') as w:
+ w.write(r'''
+\documentclass{minimal}
+\usepackage[a2paper,landscape]{geometry}
+\usepackage{figchild}
+\usepackage{graphicx}
+\begin{document}
+\end{document}
+'''[1:])
+subprocess.run([
+ 'pdflatex',
+ '--ini',
+ '&pdflatex',
+ 'mylatex.ltx',
+ 'preloaded.tex'
+],
+ check=True)
+
+
+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
+
+
+def generate_graphic(cmd):
+ 'Generate a PDF file for a given figchild command.'
+ stdout = f'*** PROCESSING {cmd} ***\n\n'
+
+ # Create a LaTeX file.
+ stdout += f'CREATE: {cmd}.tex\n'
+ div = 48
+ if cmd == 'fcPencil':
+ # Special case for \fcPencil, which is abnormally wide and short.
+ div = 12
+ with open(cmd + '.tex', 'w') as w:
+ w.write(r'''
+\documentclass{minimal}
+\begin{document}
+
+\newsavebox{\fig}
+\savebox{\fig}{\%s{1}{black}{1}}
+\newlength{\figheight}
+\settoheight{\figheight}{\usebox{\fig}}
+
+\makeatletter
+\edef\figscale{\expandafter\strip@pt\dimexpr\figheight / %d\relax}
+\makeatother
+
+\%s{1}{black}{\figscale}
+\end{document}
+'''[1:] % (cmd, div, cmd))
+
+ # Compile the LaTeX file to PDF.
+ stdout += run_and_return_output(['pdflatex', '&mylatex', cmd + '.tex'])
+
+ # Crop the PDF file.
+ stdout += run_and_return_output(['pdfcrop', cmd + '.pdf'])
+
+ # Overwrite the original PDF file with the cropped version.
+ stdout += f'RUN: mv {cmd}-crop.pdf {cmd}.pdf\n'
+ os.rename(f'{cmd}-crop.pdf', f'{cmd}.pdf')
+
+ # Output the buffered output.
+ stdout += '\n'
+ print(stdout)
+
+
+# Concurrently process all figures.
+with concurrent.futures.ProcessPoolExecutor() as executor:
+ executor.map(generate_graphic, commands)