Ограничения разметки латекса Sphinx

Я пытаюсь сделать три действительно основные вещи внутри многострочного математического режима в Sphinx (версия 1.1.2-1).

  1. запись подчеркивания как часть моих имен переменных даже в математическом режиме;
  2. использовать big, biggl, etc., разделители, чтобы сделать большие скобки и скобки;
  3. и включить регулярный текст как часть уравнений.

обратите внимание на следующие две вещи. (1) я использую необработанную строку в моем коде Python для Sphinx-документация разметки, поэтому дополнительные обратные косые черты не нужны для escape-символов, и (2) я не делаю встроенный математический режим, который разделен так в Sphinx:

:math:`Some math stuff goes here` regular text could go here...

вместо этого я делаю многострочные вещи, часто как eqnarray в LaTeX:

.. math::
    DividendYield &=& frac{DVT(t)}{CurrentMarketCap} 
    Avg_Assets &=& biggl( A/B biggr) textrm { when B is not zero...}

в настоящее время я получаю ошибки Sphinx (и сгенерированные страницы doc выглядят как тарабарщина), которые говорят такие вещи, как:

Unknown LaTeX command: textrm

то же самое происходит для biggl. Для подчеркивания, это просто всегда интерпретирует его так, как будто я обозначаю индекс, но если я использую textunderscore или другие трюки, то он бросает такие же ошибки, как и выше.

подчеркивает в математическом режиме,textrm command и большие разделители являются чрезвычайно основными частями каждого собственного пакета TeX, который я когда-либо использовал. Так почему же они недоступны через Сфинкса?

обновление

один конкретный файл Python, над которым я работаю, вычисляет данные о капитале книги для меня. Так ниже, когда вы видите материал о BookEquity, это ссылка. Я не могу запустить наш процесс build-docs, кроме как через систему управления версиями, поэтому сделать воспроизводимую ошибку было проще всего, если я просто изменил существующий файл.

однако все, что я сделал, это добавил следующую функцию класса в свой код с помощью простой docstring.

def foo(self):
    r"""
    Sample docstring

    .. math::
        Ax &=& b 
        Cx &=& biggl(frac{x/y}biggr) textrm{ if y is not zero.}
    """
    pass

и затем изображение ниже-это выход, поступающий от создания документов с помощью Sphinx 1.1.2-1.

Snippet of the generated doc page showing the error exactly as it appears from Sphinx.

если вы щелкните правой кнопкой мыши и выберите 'Просмотр изображений' вы можете увидеть лучшую версию.

3 ответов


вы должны отредактировать стандартный файл конфигурации, что sphinx-quickstart создает, иначе Сфинкс будет блевать на математические блоки. В файле conf.py, Я изменил

extensions = []

to

extensions = ['sphinx.ext.pngmath']

после этого более или менее работал следующий первый файл;

.. foo documentation master file, created by
   sphinx-quickstart on Thu Oct 25 11:04:31 2012.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to foo's documentation!
===============================

Contents:

.. toctree::
   :maxdepth: 2

This is the first chapter
=========================

Instead, I am doing multi-line stuff, often like eqnarray in LaTeX:

.. math::
    DividendYield &=& \frac{DVT(t)}{CurrentMarketCap} \
    Avg_Assets &=& \biggl( A/B \biggr) \textrm { when B is not zero...}

он произвел следующий латексный код для математического фрагмента:

\chapter{This is the first chapter}
\label{index:welcome-to-foo-s-documentation}\label{index:this-is-the-first-chapter}
Instead, I am doing multi-line stuff, often like eqnarray in LaTeX:
\begin{gather}
\begin{split}DividendYield &=& \frac{DVT(t)}{CurrentMarketCap} \
Avg_Assets &=& \biggl( A/B \biggr) \textrm { when B is not zero...}\end{split}\notag\\begin{split}\end{split}\notag
\end{gather}

выбор использования комбинации split и gather кажется мне немного странным и, очевидно, не делает хорошо работайте с кодом, который вы написали для eqnarray, но это жестко закодировано в Sphinx.

запуск pdflatex остановился на \end{gather}, с ошибкой Extra alignment tab has been changed to \cr. но я смог пройти мимо этого, введя nonstopmode. Это дает мне следующий результат:

test image

в то время как все еще что-то не так с выравниванием (из-за различий между split и eqnarray среды), textrm и biggl, похоже, работают нормально. (Обратите внимание, что вы еще нужно избежать подчеркивания в Average_Assets, но это нормально для курса, AFAICT).

вы может сойдет с рук постобработка сгенерированного кода LaTeX, например, путем замены \begin{gather}\begin{split} и \end{split}\notag\\begin{split}\end{split}\notag\end{gather} по математической среде по вашему выбору.

обновление:

скриншот из обновления, похоже, с веб-страницы, а не документа LaTeX! Поэтому мне кажется, что то, что вызывает ошибку, - это обработчик, который преобразует латексную математическую нотацию, чтобы браузер мог показать что-то. Это, вероятно, будет либо MathJax или jsMath. Глядя на код, pngmath будет создавать другие сообщения об ошибках. Согласно на этой странице ваш код должны работа в mathjax. От страница символов jsMath, не похоже, что jsmath поддерживает \Biggl. Поэтому я предполагаю, что Сфинкс настроен на использование jsMath. Взгляд на источник сгенерированной сети страница должна рассказать вам, что используется для визуализации математики. Если моя догадка верна, переключение конфигурации на использование mathjax и небольшая адаптация вашего уравнения могут решить проблему.

обновление 2: я могу определенно подтвердить, что он отлично работает с MathJax (см. ниже). Однако у меня нет установленного jsMath.

with mathjax


обновление

как уже упоминалось, сфинкс использует gather и split режим по математике. Согласно AMS math guide сплит занимает один $ знак. Так что

.. math::
    DividendYield &= \frac{DVT(t)}{CurrentMarketCap} \
    Avg_Assets &= \biggl( A/B \biggr) \textrm { when B is not zero...} \
    Avg \_ Assets &= \biggl(\frac{A}{B}\biggr) \textrm{ when B is not zero...}

.. autofunction:: mymodule.foo

С foo определяется как

def foo(self):
    r"""Sample docstring

    .. math::
        Ax &= b \
        Cx &= \biggl( \frac{x}{y} \biggr) \textrm{ if y is not zero.}
    """
    pass

отлично отображает latexpdf и html с помощью расширение MathJax.

sphinx-math

обратите внимание, что я использовал \_ для подчеркивания в математическом режиме, который работал, но \textunderscore не работает (вы должны загрузить дополнительные пакеты, я думаю, см. этот вопрос on tex.stackexchange.com). Так как это выходит, я думаю, что ваш вопрос явно Tex вопрос.

Я не удаляю свой предыдущий ответ, однако он применим только для LaTeX builder, а не для HTML builder.

оригинальный ответ

Сфинкс производит "необычный" латексный код. Он использует gather и split для уравнения (посмотрите на источник latex, который он генерирует).

проблема в том, что нет простого способа изменить источник latex, который он производит. Вы должны после обработки источника latex, чтобы получить "научный" латексный код.

Sphinx предназначен для html-документов (и веб-разработчиков, я думаю), latex (и научные "проблемы", такие как пронумерованные цифры, таблицы и уравнения), похоже, не являются основным направлением проекта. Кстати, Ваш код отлично отображает html с помощью расширение mathjax.

Я думаю, что помню некоторую критику разработчиков docutils по этой теме: docutils имеет LaTeX builder (который, кажется, "лучше"), но этот конструктор не используется sphinx.

однажды было объявление о проекте под названием relatex (ссылке) в списке рассылки для последующей обработки кода latex, созданного sphinx. Но я не уверен насчет статуса развития. Я использовал свой собственный код, который я сделал доступным здесь (к сожалению, это смесь немецкого и английского). Я не думаю, что это очень полезно, потому что я решил, что это сложно для пост-процесса Sphinx latex, и я переключился на чистый латекс. Поэтому я не стал развивать его дальше. Однако основными шагами являются

  • создайте свой собственный стиль и шаблон latex
  • пусть сфинкс создаст свой латексный код
  • после обработки кода latex и вставьте его в свой шаблон
  • используйте строительную систему для LaTeX для создания pdf-файла из вашего кода

я адаптировал файл Sphinx Makefile для этого за один шаг. В качестве строительной системы я использовал rubber (в настоящее время я хотел бы использовать latexmk).


теперь (2016) директива Sphinx math имеет опцию :nowrap: возврат полного контроля пользователю, поэтому просто

.. math::
   :nowrap:

   \begin{eqnarray}
      y    & = & ax^2 + bx + c \
      f(x) & = & x^2 + 2xy + y^2
   \end{eqnarray}

оказывает штраф в HTML и latexpdf.