Giter Club home page Giter Club logo

django-tex's Introduction

DJANGO-TEX

Django-tex is a simple Django app to render LaTeX templates and compile them into PDF files.

Django-tex requires a local LaTeX installation and uses the jinja2 templating engine for template rendering.

Installation

django-tex is currently available on test.pypi.org. It can be installed by:

pip install --index-url https://test.pypi.org/simple/ django_tex

To make this work, the requirements (django and jinja2) may need to be installed separately via pip install django and pip install jinja2, respectively.

Quick start

  1. Add "django_tex" to your INSTALLED_APPS setting:

    INSTALLED_APPS = [
        ...
        'django_tex',
    ]
  2. Configure a template engine named tex in settings.py:

    TEMPLATES = [
        {
            'NAME': 'tex',
            'BACKEND': 'django_tex.engine.TeXEngine', 
            'APP_DIRS': True,
        },
    ]
  3. Create a LaTeX template in your template directory:

    # test.tex
    \documentclass{article}
    
    \begin{document}
    
    \section{ {{- foo -}} }
    
    \end{document}
  4. Use "compile_template_to_pdf" in your code to get the PDF file as a bytes object:

    from django_tex.core import compile_template_to_pdf
    
    template_name = 'test.tex'
    context = {'foo': 'Bar'}
    PDF = compile_template_to_pdf(template_name, context)

    Or use render_to_pdf to generate a HTTPResponse containing the PDF file:

    from django_tex.views import render_to_pdf
    
    def view(request):
        template_name = 'test.tex'
        context = {'foo': 'Bar'}
        return render_to_pdf(request, template_name, context, filename='test.pdf')

Some notes on usage

Latex binary

The default LaTeX interpreter is set to lualatex. This can be changed by the setting LATEX_INTERPRETER, for instance: LATEX_INTERPRETER = 'pdflatex'. Of course, the interpreter needs to be installed on your system for django-tex to work properly.

Whitespace control

Since django-tex uses jinja, you can use jinja's whitespace control in LaTeX templates. For example, \section{ {{ foo }} } would be rendered as \section{ Bar } with the above context; \section{ {{- foo -}} }, however, gets rendered nicely as \section{Bar}.

Built-in filters

Django's built-in filters are available. So you can use {{ foo|date('d. F Y') }} to get 1. Januar 2018, for instance.

Further, django-tex adds the custom filter localize to the jinja environment. This runs its input through django.utils.formats.localize_input to create a localized representation. The output depends on the USE_L10N and LANGUAGE_CODE settings. Use the filter like this: {{ foo|localize }}.

If you want to convert linebreaks into LaTeX linebreaks (\\), use the linebreaks filter ({{ foo | linebreaks }}).

Custom filters

Custom filters can be defined as explained in the jinja documentation here. For example, the following filter formats a datetime.timedelta object as a hh:mm string:

def hhmm_format(value):
    total_seconds = value.total_seconds()
    hours, remainder = divmod(total_seconds, 3600)
    minutes, seconds = divmod(remainder, 60)
    return '{:n}:{:02n}'.format(hours, minutes)

The filter has to be added to a custom environment and the django-tex templating engine has to be made aware of the environment. This can be achieved, for example, by defining a custom environment callable in an environment.py module in your app:

# environment.py
from django_tex.environment import environment

def hhmm_format(value):
    pass # as above

def my_environment(**options):
    env = environment(**options)
    env.filters.update({
        'hhmm_format': hhmm_format
    })
    return env

... and passing the dotted path to my_environment to the TEMPLATES settings:

# settings.py

TEMPLATES = [
    {
        'NAME': 'tex',
        'BACKEND': 'django_tex.engine.TeXEngine', 
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'myapp.environment.my_environment',
        }
    },
]

django-tex's People

Contributors

weinbusch avatar sfeller11 avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.