pylatex font python latex pdflatex

python - font - rc matplotlib latex



Generando pdf-latex con script python (3)

Por supuesto, existen sistemas de plantillas como Jinja, pero probablemente son excesivos para lo que estás preguntando. También puede formatear la página usando RST y usarla para generar LaTeX, pero nuevamente es probable que eso sea una exageración. Diablos, la generación automática de la página probablemente sea una exageración para la cantidad de campos que debe definir, pero ¡desde cuándo nos detuvo en exceso! :)

He hecho algo similar con el formato de cadena de Python. Tome su documento LaTeX arriba y "tokenize" el archivo colocando %(placeholder_name1)s tokens de %(placeholder_name1)s en el documento. Por ejemplo, a dónde quiere que vaya su nombre de clase, use %(course_name)s

/textbf{/Large "%(homework_title)s" //} /vspace{1cm} /textbf{/Large "%(course_name)s" //}

Luego, desde Python, puede cargar en esa plantilla y formatearla como:

template = file(''template.tex'', ''r'').read() page = template % {''course_name'' : ''Computer Science 500'', ''homework_title'' : ''NP-Complete''} file(''result.tex'', ''w'').write(page)

Si desea encontrar esos tokens automáticamente, lo siguiente debería funcionar bastante bien:

import sys import re import subprocess template = file(''template.tex'', ''r'').read() pattern = re.compile(''%/(([^}]+)/)[bcdeEfFgGnosxX%]'') tokens = pattern.findall(template) token_values = dict() for token in tokens: sys.stdout.write(''Enter value for '' + token + '': '') token_values[token] = sys.stdin.readline().strip() page = template % token_values file(''result.tex'', ''w'').write(page) subprocess.call(''pdflatex result.tex'')

El código iterará a través de los tokens e imprimirá un aviso en la consola pidiéndole una entrada para cada token. En el ejemplo anterior, obtendrás dos indicaciones (con respuestas de ejemplo):

Enter value for homework_title: NP-Complete Enter value for course_name: Computer Science 500

La línea final llama a pdflatex en el archivo resultante y genera un PDF a partir de él. Si desea ir más lejos, también puede pedirle al usuario un nombre de archivo de salida o tomarlo como una opción de línea de comando.

Soy un estudiante universitario, y en mi universidad, para presentar cualquier tipo de tarea, tiene que tener una portada estándar (con el logotipo de la universidad, el nombre del curso, el nombre del profesor, mi nombre y bla bla bla).

Por lo tanto, tengo un documento .tex, que genera mis pdfs de portadas estándar. Va algo así como:

... /begin{document} %% College logo /vspace{5cm} /begin{center} /textbf{/huge "School and Program Name" //} /vspace{1cm} /textbf{/Large "Homework Title" //} /vspace{1cm} /textbf{/Large "Course Name" //} /end{center} /vspace{2.5cm} /begin{flushright} {/large "My name" } /end{flushright} ...

Entonces, me preguntaba si hay una manera de hacer un script de Python que me solicite el título de mi tarea, el nombre del curso y el resto de las cadenas y las use para generar la portada. Después de eso, debe compilar el .tex y generar el pdf con la información dada.

Cualquier opinión, consejo, fragmento, biblioteca, es aceptado.


Puede comenzar por definir el archivo de tex de plantilla como una cadena:

content = r''''''/documentclass{article} /begin{document} ... /textbf{/huge %(school)s //} /vspace{1cm} /textbf{/Large %(title)s //} ... /end{document} ''''''

A continuación, use argparse para aceptar valores para el curso, título, nombre y escuela:

parser = argparse.ArgumentParser() parser.add_argument(''-c'', ''--course'') parser.add_argument(''-t'', ''--title'') parser.add_argument(''-n'', ''--name'',) parser.add_argument(''-s'', ''--school'', default=''My U'')

Un poco de formato de cadena es todo lo que se necesita para pegar los argumentos en el content :

args = parser.parse_args() content%args.__dict__

Después de escribir el contenido en un archivo, cover.tex,

with open(''cover.tex'',''w'') as f: f.write(content%args.__dict__)

podría utilizar subprocess para llamar a pdflatex cover.tex .

proc = subprocess.Popen([''pdflatex'', ''cover.tex'']) proc.communicate()

También puede agregar un comando lpr aquí para agregar impresión al flujo de trabajo.

Eliminar archivos innecesarios:

os.unlink(''cover.tex'') os.unlink(''cover.log'')

El guión podría llamarse así:

make_cover.py -c "Hardest Class Ever" -t "Theoretical Theory" -n Me

Poniendolo todo junto,

import argparse import os import subprocess content = r''''''/documentclass{article} /begin{document} ... P /& B /textbf{/huge %(school)s //} /vspace{1cm} /textbf{/Large %(title)s //} ... /end{document} '''''' parser = argparse.ArgumentParser() parser.add_argument(''-c'', ''--course'') parser.add_argument(''-t'', ''--title'') parser.add_argument(''-n'', ''--name'',) parser.add_argument(''-s'', ''--school'', default=''My U'') args = parser.parse_args() with open(''cover.tex'',''w'') as f: f.write(content%args.__dict__) cmd = [''pdflatex'', ''-interaction'', ''nonstopmode'', ''cover.tex''] proc = subprocess.Popen(cmd) proc.communicate() retcode = proc.returncode if not retcode == 0: os.unlink(''cover.pdf'') raise ValueError(''Error {} executing command: {}''.format(retcode, '' ''.join(cmd))) os.unlink(''cover.tex'') os.unlink(''cover.log'')


También hay una clase de Template (desde 2.4) que permite usar $that token en lugar de %(thi)s one.