Преамбула IPython (Jupyter) MathJaX

Вопрос

Как я могу настроить преамбулу MathJax для использования в ноутбуках IPython (или Jupyter) для повторного использования таким образом, чтобы другие могли читать мои документы (на http://nbviewer.org), и это работает для генерации LaTeX/PDF?

Фон

Я хотел бы использовать IPython (теперь Jupyter) для документов, которые позже конвертирую в PDF через LaTeX (используя ipython nbconvert). Проблема заключается в том, как включить кучу макроопределений, которые я использую почти в каждом документе. Что-то вроде:

\newcommand{\vect}[1]{\vec{#1}}
\newcommand{\abs}[1]{\lvert#1\rvert}
\DeclareMathOperator{\erf}{erf}

и т.д.. Что касается ноутбуков, то одно неудовлетворительное решение состоит в том, чтобы просто включить их в ячейку уценки в верхней части ноутбука, заключенную между двумя знаками доллара $$, поэтому она интерпретируется как математика. Если это сделано после некоторого вводного текста, то это даже не влияет на выход.

Проблема заключается в том, что при преобразовании в LaTeX (для экспорта PDF) эти команды встроены в математическую среду в файле LaTeX. У этого есть несколько проблем:

  • Команды, такие как \DeclareMathOperator, должны войти в преамбулу документа LaTeX.
  • Определения команд являются локальными для уравнения и не доступны позже в документе. (Это можно преодолеть, используя \gdef или \global\def, но затем нужно обмануть MathJax в распознавании этих команд с чем-то вроде \let\gdef{\def}, который каким-то образом скрыт от LaTeX. Любой способ, которым я нашел, сделать эту работу равным уродливому взломать.)
  • Иногда команды уже определены в LaTeX и должны иметь \renewcommand (не поддерживаемые MathJax, но снова могут быть предоставлены \let\renewcommand\newcommand и т.д., что кажется мне разумным, так как MathJax не может иметь некоторое представление о том, что преамбула может использоваться для окончательного файла LaTeX).

Возможно, решение заключается в предоставить набор макросов для MathJax, добавив код вроде (не уверен, что эквивалент \DeclareMathOperator здесь...)

<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  TeX: {
    Macros: {
      vect: ["{\\vec #1}",1],
      abs: ["{\\lvert #1 \\rvert}",1]
    }
  }
});
</script>

в файл custom.js и затем предоставить пакет LaTeX для включения при преобразовании в PDF. Проблема с этим подходом заключается в следующем: как распространять файл custom.js и файл стиля LaTeX для других (соавторов и зрителей) для использования?

  • Я хочу, чтобы соавторы могли редактировать и читать мои документы без необходимости устанавливать настраиваемые расширения в своей глобальной конфигурации. Чтобы быть спецификацией, я в порядке, требуя, чтобы они запускали команду, например, python setup.py configure, когда они загружают/проверяют мой код, который выполняет локальные модификации проекта, например, заполняет файлы ipython_notebook_config.py во всех каталогах, содержащих ноутбуки, но я недовольны установкой расширений, или изменение их личного глобального файла custom.js.

    В моем блоге преткновения я не знаю, как добавить вклады из локального файла custom.js в цепочку ноутбуков и подозревать, что это может нарушить политику безопасности.

    Лучшее решение не потребует каких-либо действий со стороны моего сотрудника.

  • Я хочу, чтобы мои ноутбуки работали над http://nbviewer.org, и чтобы люди могли загружать ноутбук и создавать PDF. (Я думаю, это исключает возможность использования custom.js хаков и распределенного файла *.sty, но я не уверен.)

  • Я бы предпочел, чтобы просто начать новый ноутбук, а затем начать писать, не вставляя кучу кода шаблона в начале каждого ноутбука, хотя он был бы прав, чтобы иметь простой способ автоматизации этого процесс с использованием расширения для ноутбука или некоторых перехватчиков в python_notebook_config.py.

Ссылки

Следующие сообщения затрагивают некоторые из этих проблем, но не соответствуют большинству фронтов:

Обсуждение (потенциальных) проблем с pandoc создание файлов LaTeX из ноутбуков IPython:

Общее обсуждение математики в записных книжках:

Ответ 1

Я думаю, что вы можете решить некоторые из ваших проблем, но не все.

Во-первых, камень преткновения. Я считаю (хотя, возможно, и ошибаюсь), что nbviewer не смотрит ни на что, кроме самого ноутбука. Например, я не вижу, как он может запускать ipython_notebook_config.py хранящийся вместе с вашим ноутбуком. Таким образом, это исключает эту линию мысли, а это означает, что я думаю, вам придется укусить пулю и добавить шаблон для каждого ноутбука. Но вы можете, по крайней мере, свести к минимуму шаблон. В этом ключе:

Вы можете сохранить custom.js (возможно, более описательное имя) на github или что-то еще, а затем добавить одну строку шаблона ко всем вашим ноутбукам для загрузки этого script из URL-адреса. Вам все равно понадобится шаблон, но он будет намного короче.

После того, как вы выполнили ячейку кода, содержащую javascript, она сохраняется в записной книжке, а это означает, что она будет автоматически выполняться в следующий раз, когда браузер загрузит ее, даже до того, как будет выполнена кодовая ячейка. Поэтому, если nbviewer не предотвратит выполнение javascript, он должен работать нормально. Это также поможет работать с сотрудниками, потому что им не нужно будет загружать дополнительные файлы.

Что касается вашего собственного файла стиля, я подозреваю, что любой, достаточно сложный, чтобы установить ipython и латекс, загрузить ваш ноутбук и запустить nbconvert на нем, также будет достаточно сложным, чтобы загрузить файл .sty. Во всяком случае, я не вижу никакого способа сделать это...