Ipython: Номера уравнений в тетради.

Созданный на 26 авг. 2013  ·  45Комментарии  ·  Источник: ipython/ipython

Встроенный LaTeX IPython не включает нумерацию уравнений. Было бы здорово, если бы последовательности LaTeX, которые обычно нумеруются (т. е. блоки \begin{equation} ... \end{equation}), получали (необязательно?) номера. Слэм-данк был бы, если бы мы могли прикреплять ссылки к уравнениям и ссылаться на них как-то позже в тексте.

notebook

Самый полезный комментарий

это уже решено или я должен +1 это?

Все 45 Комментарий

+1
Это довольно важная особенность для любого вида математического документа.
Я считаю, что MathJax уже имеет эту возможность:

http://docs.mathjax.org/en/latest/tex.html#automatic-уравнение-нумерация

Что касается ссылок, я думаю, что крайне важно разработать общую систему перекрестных ссылок с унифицированным синтаксисом, а не ту, которая специфична для уравнений LaTeX (и бэкендов LaTeX).

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

Это, вероятно, придется подождать, пока не будет доступна система для доступа к переменным Python из ячеек уценки, поскольку она, вероятно, будет использовать аналогичную систему.

См. https://github.com/ipython/ipython/pull/2517#issuecomment -9884544 и прокомментируйте.

Это также, по-видимому, решает проблему более полно http://stackoverflow.com/questions/18823779/ipython-notebook-and-mathjax-labeled-equations

@ahmadia , в чем проблема, почему уравнения не могут быть пронумерованы по умолчанию? Невозможность нумеровать и ссылаться на уравнения в настоящее время очень раздражает.

+1. Похоже, реализация # 5921 позволила бы это легко.

+1. Надеюсь, это будет реализовано очень скоро

+1

+1.
Я использую ноутбуки ipython в качестве дополнения к учебным материалам для университетского курса электромагнетизма для младших классов, и я делаю это в качестве тестового примера, чтобы выяснить, следует ли настаивать на широком внедрении ноутбуков ipython в нашей учебной программе бакалавриата. Отсутствие последовательной нумерации уравнений в записной книжке или в разделах записной книжки является серьезным ограничением, наряду с возможностью ссылаться на номера уравнений в тексте. Я согласен с тем, что такая нумерация относится к частям блокнота LaTeX, особенно если попытка более общего подхода означает более длительное ожидание получения этой функциональности.

+1.
То же самое здесь, я пишу свои заметки для курса численного исчисления с использованием ipython, и нумерация ссылок действительно отсутствует.

+1

Это единственное, что мешает мне использовать iPython Notebooks в качестве основного инструмента для написания документов (за исключением отсутствия совместной работы в реальном времени, но это не так важно). Вместо этого я должен делать черновые наброски здесь, а затем портировать их в редактор LaTeX.

+1 :+1: Мы используем это для чтения лекций, и эта функция абсолютно необходима!

Хорошо, я, наконец, попробовал «решение», описанное в этом посте , где вы изменяете mathjaxutils.js. Пока вы обновляете веб-страницу блокнота ipython после внесения изменений в ячейки уценки, содержащие латекс, номера уравнений отображаются и делают это в правильном порядке. Обновление страницы также исправляет метки, которые становятся неразрешенными при повторном запуске ячейки, в которой они определены (т. е. при нажатии клавиши Shift-Enter). Однако при отображении блокнота на nbviewer.ipython.org номера уравнений полностью отсутствуют, а метки не разрешены, поэтому они заменяются на «???». где на них ссылаются в текстовых ячейках уценки. Суть в том, что это не очень хорошее решение для большинства случаев использования, хотя я рад, что оригинальный постер задал вопрос и понял это.

Упоминается здесь:
https://github.com/jupyter/nbviewer/pull/459

Я хотел пронумеровать уравнения, возвращаемые ячейками кода.
Это то, что я использовал: http://nbviewer.ipython.org/github/MalteJin/Manual-equation-numbering/blob/branch/Manual%20equation%20numbering.ipynb

^ Является ли это рекомендуемым в настоящее время решением?

Удар. Я использую блокноты Jupyter для своих заметок по курсу, и это серьезная проблема. Будет ли удобный синтаксис для ручной нумерации уравнений достойным компромиссом?

Будет ли удобный синтаксис для ручной нумерации уравнений достойным компромиссом?

Это хорошая идея @poulson , и в MathJaX есть синтаксис \tag , который поддерживает это.
Ручной ввод тегов MathJax Equation в примере Jupyter Notebook . Те же ограничения (повторное выполнение ячейки Markdown приведет к поломке MathJaX, если вы не обновите браузер), но, по крайней мере, вам не нужно перенастраивать блокнот для этого.

@ahmadia Спасибо! Повторное выполнение разбиения ячейки определенно немного расстраивает, но это огромный прогресс по сравнению с \begin{equation} без маркировки!

@ahmadia Ожидается ли, что ссылки на уравнения не разрешаются в вашей ссылке или в живой записной книжке (даже после обновления)?

Попробуйте обновить, затем выполните все ячейки. Я не думаю, что ссылки работают в GitHub
потому что GH удаляет URL-адреса.

В субботу, 3 октября 2015 г., Джек Поулсон, [email protected] , написал:

@ahmadia https://github.com/ahmadia Ожидается ли, что уравнение
ссылки не разрешаются в вашей ссылке или в живой записной книжке (даже после
освежает)?


Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/ipython/ipython/issues/4113#issuecomment-145305340 .

У меня это не сработало, но поскольку все жестко закодировано, я не вижу причин настаивать на использовании \ref . Поэтому я жестко закодировал номера уравнений для ссылок и создал конечный продукт, который можно увидеть здесь: http://web.stanford.edu/class/math53/notebooks/Week2.html .

Спасибо @poulson за продвижение. Я сталкиваюсь с этим снова и снова, и жесткое кодирование чисел уравнений довольно плохо, но что поделаешь... IPython должен иметь встроенную поддержку для этого.

Лучший обходной путь на данный момент, спасибо, ребята!

Если вы включаете код:

MathJax.Hub.Config({
  TeX: { equationNumbers: { autoNumber: "AMS" } }
});

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

На самом деле, вы можете сбросить нумерацию уравнений и перерисовать уравнения в блокноте.

Я сделал простое расширение для ноутбука, которое делает это:
https://github.com/ipython-contrib/IPython-notebook-extensions/pull/335

@juhasch отлично! Учитывая очень плохой опыт работы с числами в уравнениях в большинстве случаев, я думаю, что по умолчанию отключено — лучший выбор. Но сделать это параметром конфигурации внешнего интерфейса с действием по перенумерации было бы здорово (кнопка панели инструментов, вероятно, слишком драгоценное место, чтобы выделять ее, но действие меню было бы в порядке).

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

@lucasb-eyer Я думаю, что это хорошо для расширения, которое предоставил @juhasch , но мы, вероятно, не будем делать это по умолчанию, поскольку и сочетания клавиш по умолчанию, и место на панели инструментов чрезвычайно ценны. Но можно было бы добавить одно или оба через custom.js или nbextension.

@minrk : расширения можно легко активировать/деактивировать, а повторный рендеринг включать/выключать с помощью серверного расширения nbextensions:
clipboard01

Если вы нажмете кнопкуbutton кнопка панели инструментов, нумерация уравнений сбрасывается/перерисовывается.

@juhasch спасибо за вашу работу! Это большой шаг вперед.

@minrk по вашему опыту, что бы вы предложили в качестве долгосрочного правильного решения для нумерации уравнений? Расширение @juhasch на данный момент является просто обходным путем. Я не прошу вас реализовать это, просто наметьте, каким должно быть решение. Я думаю, что многих это действительно беспокоит, и если мы знаем, как правильно двигаться вперед, мы можем попробовать сделать это.

что бы вы предложили в качестве долгосрочного правильного решения нумерации уравнений?

Вы не можете иметь его. MathJax предполагает, что у него есть доступ ко всей странице, когда он выполняет нумерацию уравнений, а IPython отображает Markdown для каждой ячейки, что является единственным разумным способом сделать это для больших ноутбуков. Это потребует работы/реализации на стороне MathJax, а не на блокноте.

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

что бы вы предложили в качестве долгосрочного правильного решения нумерации уравнений?

На данный момент я бы в основном сделал то, что @juhasch сделал со своим расширением, со следующими изменениями, если они будут объединены с мастером:

  1. отключи его по умолчанию
  2. сохранить переключатель в интерфейсе-конфигурации, поэтому вам нужно включить его только один раз
  3. добавить действие перенумерации, чтобы его можно было привязать к сочетанию клавиш
  4. поместите пользовательский интерфейс по умолчанию для перенумерации в меню вместо панели инструментов

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

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

Учитывая документацию, это звучит как разумный план для меня как для пользователя. :+1:

@minrk : как пользователь, я тоже нашел бы это полезным решением. Насколько обременительным будет повторный рендеринг всех выводов уценки и HTML?

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

+1

+1 за эту функцию. Я готовлю лекции по физике для студентов, и нумерация уравнений очень важна.

Другой вариант, который позволяет обновлять номера уравнений без повторной визуализации всего, — это javascript, который ищет в выводе HTML элементы с уравнениями или ссылками и заменяет их текст соответствующим значением.

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

На данный момент этой поддержки нет, но следующие обходные пути сделают свое дело.

  • используйте \tag{labelname} для создания номера уравнения. Обратите внимание, что здесь тег является меткой
  • сослаться на него в уценке с необработанным HTML-кодом <span class=reference data-target=labelname></span> Это необходимо, потому что вывод HTML \ref или \eqref не включает имя метки.

Например

$$
\begin{equation}
  A = 1 \tag{eq:sample}
\end{equation}
$$

The amazing result in <span class=reference data-target="eq:sample"></span> can ...blah..blah

Следующий сценарий обновляет номера уравнений. Его необходимо запускать после отображения новых номеров уравнений или ссылок. А пока вы можете поместить скрипт в отдельную ячейку и запускать его вручную при необходимости. Полное решение требует некоторого механизма для запуска повторного запуска в соответствующее время.

%%javascript

// find all equation numbers (tags) that have no data-label attribute and set
// it to the tag text
$("span.mtd[id|='mjx-eqn']").not("[data-label]").each(
    function (index)
    {
        $(this).attr("data-label", $(this).text().slice(1,-1));
    }
);

// loop over all equation numbers and set the text 
$("span.mtd[id|='mjx-eqn']").each(
    function (index)
    {
        $(this).text("(" + (index+1) + ")");
    }
);

// loop over all references and resolve them by finding the
// equation number with a matching data-label attribute
$("span.reference").each(
    function (index)
    {
        var target = $(this).attr("data-target");
        var eqn = $("span.mtd[id|='mjx-eqn'][data-label='" + target + "']").text()
        $(this).text(eqn)
    }
);

Обратите внимание, что скрипт обновляет только числа, оставляя весь макет без изменений. Это должно быть намного эффективнее, чем позволять MathJax перерисовывать все.

@basvandertol Спасибо за образец, но я не понимаю, чем это может быть полезно, поскольку результаты видны только на текущем экране: они не сохраняются, не могут быть распечатаны, не могут быть просмотрены в nbviewer или видны в любом выводе (PDF, HTML и т. д.) я не вижу, что это обходной путь. Я неправильно вас понял? Или это только часть решения?

Спасибо за отзыв @dsblank. Это действительно лишь частичное решение, особенно проблемы обновления номеров уравнений при редактировании записной книжки без повторного рендеринга всего. Я экспериментировал с атрибутами данных HTML, чтобы добиться этого. Позже я обнаружил, что nbconvert использует аналогичный подход для работы со ссылками Latex. http://nbconvert.readthedocs.io/en/latest/latex_citations.html

На данный момент MathJax не добавляет достаточных атрибутов в вывод HTML для разрешения ссылок после рендеринга. Вот почему я использую эти хакерские ярлыки и ссылки, чтобы получить нужный мне вывод HTML. С этими метками нормальное преобразование в Latex -> pdf нарушается.

Сейчас я знакомлюсь с исходным кодом MathJax, чтобы узнать, есть ли простой способ добавить атрибуты HTML к обычным меткам и ссылкам.

Следующим шагом будет добавление поддержки в nbconvert для распознавания этих HTML-атрибутов, как это уже происходит с цитатами. Если бы nbconvert мог также сканировать вывод разделов кода на наличие HTML с этими атрибутами, то заголовок/метка HTML можно было бы добавить к рисункам, сгенерированным кодом, и nbconvert
может генерировать правильный вывод Latex. Затем на рисунки можно ссылаться в ячейках разметки.

Это всего лишь набросок подхода к полной поддержке ссылок в блокнотах ipython. Мне это кажется осуществимым, но если кто-то уже сейчас видит шоушоппер, пожалуйста, дайте мне знать. Я очень мало знаю о внутренностях ноутбука ipython. Это кажется забавным проектом, чтобы узнать больше, но сейчас я не могу контролировать все последствия.

Только что нашел эту (длинную) тему...

Может быть, это может быть интересно: я попытался что-то сделать для поддержки рендеринга сред LaTeX, включая _автоматическую нумерацию и обновление_ как уравнений, так и сред, для всего документа.
В нем использовалась кнопка для обновления, но теперь используется идея, аналогичная упомянутой выше @basvandertol .

Конечно, все это добавляет некоторую перегрузку, но для меня это в целом приемлемо, даже для довольно длинных документов. Доступен экспорт блокнота в документы html и LaTeX;

Вы можете посмотреть расширение здесь или на Pypi . Лучший.

+1 за интеграцию некоторых версий предложенных решений в мастер.

это уже решено или я должен +1 это?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги