2012-10-22 4 views
6

Sto provando a fare tre cose di base all'interno di una modalità matematica multi-line in Sphinx (versione 1.1.2-1).Sphinx Limiti di markup LaTeX

  1. Scrivere caratteri di sottolineatura come parte dei nomi delle variabili anche in modalità matematica;
  2. Utilizzare il \big, \biggl, ecc., I delimitatori per creare parentesi e parentesi grandi;
  3. e includere testo normale come parte delle equazioni.

Nota le seguenti due cose. (1) Sto usando una stringa grezza nel mio codice Python per la documentazione di Sphinx-markup, quindi non sono necessari backslash aggiuntivi per i caratteri di escape, e (2) Non sto facendo la modalità matematica inline, che è delimitata in Sphinx:

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

Invece, sto facendo cose più righe, spesso come eqnarray in LaTeX:

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

Attualmente, ottengo Sphinx errori (e le pagine doc generate sembrano senza senso), che dicono cose Mi piace:

Unknown LaTeX command: textrm 

Lo stesso accade per \biggl. Per il carattere di sottolineatura, lo interpreto sempre come se stessi indicando un pedice, ma se uso \textunderscore o altri trucchi, esso genera gli stessi errori di cui sopra.

I caratteri di sottolineatura in modalità matematica, il comando textrm e i delimitatori grandi sono parti estremamente di base di ogni pacchetto TeX nativo che abbia mai usato. Quindi perché sono inaccessibili attraverso Sfinge?

Aggiornamento

Un particolare file di Python che sto lavorando su calcola i dati patrimonio netto contabile per me. Così sotto, quando vedi cose su BookEquity, questo è il riferimento. Non riesco ad eseguire il nostro processo di compilazione dei documenti se non attraverso un sistema di controllo della versione, quindi rendere l'errore riproducibile è più semplice se ho appena modificato un file esistente.

Tuttavia, tutto ciò che ho fatto è stato aggiungere la seguente funzione di classe nel mio codice, con una semplice docstring.

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

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

E poi l'immagine qui sotto è l'uscita proveniente dal costruire i documenti con Sphinx 1.1.2-1.

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

Se destro del mouse e selezionare 'immagine Vista' si può vedere una versione migliore.

+0

Spiacente non so di Sphinx, ma penso che i caratteri di sottolineatura debbano essere sfuggiti '\ _', e potresti provare a usare' \ text {} 'invece di' \ textrm' (richiede il 'amsmath' pacakge) . –

+0

Grazie per il tentativo. '\ _' e' \ text' erano cose che ho immediatamente provato quando ho ricevuto questo errore. Le pagine del documento Sfinge specificano specificamente che usano 'amsmath'. '\ text' sembra funzionare, ma questo non aiuta a risolvere il problema. Tuttavia, è una buona soluzione per quel 1/3 della domanda. – ely

+0

Potresti postare parte del codice LaTeX generato, ad es. per i tuoi esempi? –

risposta

6

È necessario modificare il file di configurazione standard creato da sphinx-quickstart, altrimenti lo sphinx verrà barrato in blocchi matematici.Nel file conf.py, ho cambiato

extensions = [] 

a

extensions = ['sphinx.ext.pngmath'] 

Dopo che il seguente file prima più o meno ha funzionato;

.. 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...} 

ha prodotto il seguente codice LaTeX per il frammento di matematica:

\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} 

La scelta di utilizzare la combinazione di scissione e raccogliere sembra un po 'strano per me, e, ovviamente, non funziona bene con il codice che hai scritto per eqnarray, ma questo è hardcoded in Sphinx.

L'esecuzione di pdflatex si è interrotta a \end{gather}, con l'errore Extra alignment tab has been changed to \cr. ma sono riuscito a procedere oltre inserendo nonstopmode. Questo mi dà il seguente risultato:

test image

Mentre c'è ancora qualcosa che non va con l'allineamento (a causa delle differenze tra gli ambienti split e eqnarray), il textrm e biggl sembrano funzionare bene. (Nota che devi ancora scappare dal trattino basso in Average_Assets, ma questo è il par per il corso, AFAICT).

È possibile ottenere il postprocessing del codice LaTeX generato, ad es. sostituendo \begin{gather}\begin{split} e \end{split}\notag\\\begin{split}\end{split}\notag\end{gather} dall'ambiente matematico di tua scelta.

Aggiornamento:

La schermata l'aggiornamento sembra essere da una pagina web, non un documento LaTeX! Quindi mi sembra che ciò che sta producendo l'errore sia il gestore che converte la notazione matematica LaTeX in modo che possa essere mostrata da un browser. Probabilmente sarà o MathJax o jsMath. Dall'esame del codice, pngmath genererebbe altri messaggi di errore. In base allo this page, lo snippet di codice deve essere in MathJax. Da jsMath symbols page, non sembra che jsmath supporti \Biggl. Quindi la mia ipotesi migliore è che SPhinx sia configurato per usare jsMath. Una sbirciatina all'origine della pagina web generata dovrebbe dirti cosa viene usato per rendere la matematica. Se la mia ipotesi è corretta, cambiare la configurazione per usare mathjax e adattare leggermente l'equazione potrebbe risolvere il problema.

Aggiornamento2: Posso sicuramente confermare che funziona bene con MathJax (vedi sotto). Non ho installato jsMath, però.

with mathjax

+0

Grazie, questo è molto utile. Tuttavia, non ho dovuto fare nulla per ottenere il rendering dei blocchi matematici in generale. Per esempio, posso rendere i blocchi matematici multi-linea solo bene, sono solo determinati comandi come '\ textrm' che hanno causato errori. Puoi spiegare in che modo è coerente con la necessità del dimming pngmath? Dovrò controllare con uno dei nostri amministratori sys qui per esplorare questo, ma è un vantaggio promettente. – ely

+0

Se ho omesso l'estensione pngmath, la sfinge ha sollevato un'eccezione quando si incontra un blocco matematico. Ho dovuto guardare la fonte per capire perché, ma non ho annotato i particolari. Forse il tuo sysadmin o (più probabile) costruttore di pacchetti ha cambiato qualcosa dalla vaniglia Sphinx? (poiché c'è un -1 dopo il numero di versione) –

+0

No, 1.1.2-1 è lo standard di Sphinx. La Sfinge segna le versioni in questo modo. C'è 1.1.3-2, per esempio. Il fatto che i blocchi matematici mi rendano per niente mi fa pensare che usiamo già il pngmath, o qualche altra opzione equivalente, nelle configurazioni. Immagino che sia solo la versione Sphinx che ti permette di eseguire i comandi che mi stanno causando errori? Per esempio, se tolgo \ biggl e cambio \ textrm in solo \ text, l'esempio sopra riportato è stato compilato correttamente per me e i documenti sembrano giusti. Ma se cambio \ biggl o \ textrm e nient'altro, allora si rompe. – ely

5

Aggiornamento

Come accennato, sfinge utilizza gather e split per la modalità matematica. In base allo split AMS math guide, viene utilizzato un unico segno $.Così

.. 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 

con foo definito come

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

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

rende bene con latexpdf e HTML con il MathJax extension.

sphinx-math

Nota che ho usato \_ per la sottolineatura in modalità matematica, che ha funzionato, ma non ha funzionato \textunderscore (è necessario caricare pacchetti aggiuntivi a mio avviso, vedere this question su tex.stackexchange.com). Così come viene fuori, penso che la tua domanda sia chiaramente una domanda Tex.

Non rimuovo la mia risposta precedente, tuttavia è applicabile solo per il builder di latex, non per il builder html.

risposta originale

Sfinge produce codice di lattice "insolito". Usa gather e split per le equazioni (dai un'occhiata all'origine del lattice che genera).

Il problema è che non esiste un modo semplice per modificare l'origine del lattice che produce. Devi post-elaborare il codice sorgente in lattice per ottenere il codice in lattice di grado "scientifico".

Sphinx è progettato per i documenti html (e, secondo gli sviluppatori Web, credo), il lattice (e "problemi" scientifici come figure numerate, tabelle ed equazioni) non sembra essere l'obiettivo principale del progetto. A proposito, il tuo codice restituisce bene ad html con l'estensione mathjax.

Penso di ricordare alcune critiche degli sviluppatori di docutils anche su questo argomento: docutils ha un builder in lattice (che sembra essere "migliore"), ma questo costruttore non è usato dalla sfinge.

C'era una volta un annuncio di un progetto chiamato relatex (link) sulla mailing list per post-elaborare il codice in lattice creato da sfinge. Ma non sono sicuro dello stato di sviluppo. Ho usato il mio codice personale, che ho reso disponibile here (sfortunatamente è un misto di tedesco e inglese). Non penso che sia molto utile, perché ho deciso che è complicato post-processare il lattice di sfinge e sono passato al puro lattice. Quindi non l'ho sviluppato ulteriormente. Tuttavia i passi fondamentali sono

  • creare il proprio stile di lattice e mascherina
  • andiamo sfinge creano è codice di lattice
  • post-processo il codice lattice e incollalo nel tuo modello
  • utilizzare un sistema di costruzione per LaTeX per generare il pdf dal tuo codice

Ho adattato la Sfinge Makefile per fare questo in un unico passaggio. Come sistema di costruzione ho usato rubber (al giorno d'oggi vorrei usare latexmk).

+0

Questo è utile come informazioni di base su Sfinge. Potresti scrivere un po 'di più sul processo specifico per post-processare l'output Sphinx in modo che il TeX esegua il rendering? Questa potrebbe essere un'opzione per me, soprattutto se posso scrivere uno script Python per farlo automaticamente ogni volta che creo la documentazione. – ely

1

Now (2016) Sfinge direttiva matematica ha l'opzione di tornare :nowrap: controllo completo per l'utente, in modo da fare proprio

.. math:: 
    :nowrap: 

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

rende bene sia in html e latexpdf.