2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Breqn Дублирование знаков мат. операций при переносе
Сообщение06.01.2020, 20:40 
Приветствую, коллеги.

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

В самом пакете такой возможности, по всей видимости, не предусмотрено (в документации такая функциональность не указана).

Из полезных источников смог найти только следующие:

1. Пакет rumathbr.sty Дениса Рябова для переноса внутритекстовых формул
https://d-ryabov.livejournal.com/723.html?view=5843#t5843

2. Статья Михаила Гринчука, где затрагивается данная тема
http://www.tug.org/TUGboat/Articles/tb17-4/tb53grin.pdf

На данный момент мне не очень ясно, возможно ли применить тот же подход, что и в пакете rumathbr.sty Дениса Рябова, в пакете breqn или требуется другое решение.

Также отмечу, что использование пакета breqn не принципиально, подойдет любой способ, который позволит автоматически переносить простые алгебраическое формулы (инженерные расчеты) с учетом дублирования знаков.

Благодарю за внимание.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение06.01.2020, 22:53 
SolidWorker
Ну вот на ctan все, что вижу https://ctan.org/pkg/rmathbr
Сама не пробовала. Попробуете - расскажите, пожалуйста.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение06.01.2020, 23:06 
Этот пакет для внутритекстовых формул (в первом пункте про него как раз говорится), более того он несовместим с breqn (это указано в комментариях пакета).

Была еще такая идея: использовать amsmath - окружение с указанием \split, при этом разбиение исходного выражения делать python-скриптом (или Lua), но я нигде не могу найти подходящих библиотек и\или примеров подобной реализации.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение07.01.2020, 00:02 
SolidWorker в сообщении #1433734 писал(а):
более того он несовместим с breqn

Вы же сказали, Вам необязательно. Я не так поняла?

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

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

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение07.01.2020, 00:42 
Пакет rumathbr работает только для внутритекстовых формул, для выключных он не используется, поэтому сам по себе он для меня бесполезен.

Что касается этого:

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


то я не очень понял о чем речь. Как раз, чтобы избежать ручного переноса в математических выражениях, используются пакеты breqn или autobreak. У меня отчеты по расчетам сплошь состоят из длинных выражений, с подстановкой численных значений и прочими прелестями и в ручную делить такие выражения, это пустая трата времени. Естественно, что сами выражения генерируются в полностью автоматическом режиме, ни о каком ручном наборе формул речи не идет.

К сожалению ГОСТы на оформление (ГОСТ 2.105-95 ЕСКД, ГОСТ Р 54521-2011 и ГОСТ 1.5-2001) требуют, что бы перенос формул был с дублированием символов.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение07.01.2020, 00:55 
SolidWorker в сообщении #1433751 писал(а):
У меня отчеты по расчетам сплошь состоят из длинных выражений, с подстановкой численных значений и прочими прелестями

В таком случае, причина взаимонепонимания понятна: я их стараюсь избегать, при малейшей возможности: мне нужно, чтобы текст прочитали. Разные цели. ГОСТы меня мало волнуют.

Совет с новосибирским макросом я так понимаю, Вам тоже неинтересен? почему? не работает? не работает как надо?

-- 07.01.2020, 02:58 --

SolidWorker в сообщении #1433751 писал(а):
Естественно, что сами выражения генерируются в полностью автоматическом режиме, ни о каком ручном наборе формул речи не идет.

Не умею я выражения типа align переносить в автоматическом режиме.

Ладно, может, кто-то придет, кто умеет.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение07.01.2020, 01:04 
Так он для ручного разбиения подходит, но не для автоматического. С тем же результатом я могу использовать amsmath-окружение c включенным \split.

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

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение07.01.2020, 01:08 
Дисконнект :D
Я Вас давно поняла.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение29.01.2020, 19:40 
Аватара пользователя
Вставлю 5 копеек. Вот уже полтора десятка лет использую одну и ту же вставку во все преамбулы. Чья - бог весть. До сих пор хватало всегда. Точки, конечно, вручную заменять на $\times$ приходится.
Используется синтаксис LaTeX
\begingroup
\catcode`\+\active\gdef+{\mathchar8235\nobreak\discretionary{}%
 {\usefont{OT1}{cmr}{m}{n}\char43}{}}
\catcode`\-\active\gdef-{\mathchar8704\nobreak\discretionary{}%
 {\usefont{OMS}{cmsy}{m}{n}\char0}{}}
\catcode`\=\active\gdef={\mathchar12349\nobreak\discretionary{}%
 {\usefont{OT1}{cmr}{m}{n}\char61}{}}
\endgroup
\def\cdot{\mathchar8705\nobreak\discretionary{}%
 {\usefont{OMS}{cmsy}{m}{n}\char1}{}}
\def\times{\mathchar8706\nobreak\discretionary{}%
 {\usefont{OMS}{cmsy}{m}{n}\char2}{}}
\AtBeginDocument{\mathcode`\==32768\mathcode`\+=32768 \mathcode`\-=32768 }

 


Или вот тут: post680584.html#p680584

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение29.01.2020, 20:02 
Аватара пользователя
У меня гениальная идея!!!

Берёте выключную формулу, а внутрь неё вставляете внутритекстовую. А она автоматически разобьётся. И выглядеть это будет так, как вам и хочется. (Например, array с типом столбца p.)

-- 29.01.2020 20:06:43 --

Otta
Вообразите себе производные, рассчитанные автоматически какой-нибудь Mathematica, каждое выражение на полторы страницы.

Правда, разбиение по $+,-,=,\cdot,/$ тут не поможет до конца. Вылезут длинные знаки дроби и знаки корня. Их надо обрабатывать сильно интеллектуальнее.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение04.04.2020, 23:47 
Попробуйте такой набросок в преамбулу (выполнить после загрузки пакета breqn):

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\makeatletter
\mathcode`\=="8000{\catcode`\==\active\gdef={\discretionary{\hbox{$\m@th\displaystyle\mathchar"303D$}}{}{}\penalty\relpenalty\mathchar"303D\relax}}
\mathcode`\+="8000{\catcode`\+=\active\gdef+{\discretionary{\hbox{$\m@th\displaystyle\mathchar"202B$}}{}{}\penalty\binoppenalty\mathchar"202B\relax}}
\mathcode`\-="8000{\catcode`\-=\active\gdef-{\discretionary{\hbox{$\m@th\displaystyle\mathchar"2200$}}{}{}\penalty\binoppenalty\mathchar"2200\relax}}
\let\orig@times=\times
\def\*{\mathbin{}%
  \mathchoice{%
      \discretionary{\hbox{$\m@th\displaystyle\orig@times$}}{\hbox{$\m@th\displaystyle\orig@times$}}{}%
    }{%
      \discretionary{\hbox{$\m@th\textstyle\orig@times$}}{\hbox{$\m@th\textstyle\orig@times$}}{}%
    }{%
      \discretionary{\hbox{$\m@th\scriptstyle\orig@times$}}{\hbox{$\m@th\scriptstyle\orig@times$}}{}%
    }{%
      \discretionary{\hbox{$\m@th\scriptscriptstyle\orig@times$}}{\hbox{$\m@th\scriptscriptstyle\orig@times$}}{}%
    }%
  \penalty\binoppenalty%
}
\gdef\times{\discretionary{\hbox{$\m@th\displaystyle\orig@times$}}{}{}\penalty\binoppenalty\orig@times\relax}
\makeatother
 


У меня на простых примерах работает. Если нужно дублировать и другие математические символы - это делается аналогично с \times в коде выше.

PS. Основная разница между переносом символов во внутритекстовых и выделенных формулах из пакета breqn состоит в том, что по во внутритекстовых формулах символ, на котором происходит перенос, остается на той же строке, а в выделенных breqn переносит его на следующую строку. Поэтому для внутритекстовых формул в пакете rmathbr достаточно вставить \discretionary после этого символа, а для breqn это нужно сделать перед ним.

PPS. Можно попробовать модифицировать пакет rmathbr, чтобы он сам определял, куда правильно вставлять дополнительный символ (добавить условие по аналогии с \if@display из amsmath), но это не такая простая работа в плане тестирования, и пока у меня на это, к сожалению, нет времени.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение05.04.2020, 08:16 
Момент, на который не обращал внимания. Прислали правку для ЖВМ, редактор потребовал умножение при переносах делать не точкой, а крестиком. Это требование какого-то ГОСТа, международная практика, или только правила, придуманные ЖВМ?

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение05.04.2020, 12:48 
Аватара пользователя
Это практика по крайней мере отечественная многолетняя.
https://ru.wikipedia.org/wiki/Перенос_(типографика)#Перенос_формул

Для числовых выражений так. Если у вас умножения, например, векторов, то точки и крестики различаются по смыслу, и можно на эту тему апеллировать, что смысл выражения менять нельзя.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение05.04.2020, 14:11 
Проблема в том, что в LaTeX автоматическую замену $\cdot$ на $\times$ при переносе можно сделать только для текста, но не для формул. В пакете rmathbr есть команда \cdott, которая именно так и работает: выходит из математического режима, делает "правильный" перенос, и начинает математический режим заново. Очевидно, что с выделенными формулами такой трюк не сработает.

Можно использовать команду \*, которая обозначает "пустое" умножение, которое при переносе заменяется на $\times$. Для большинства физико-математических текстов этого достаточно

Я тут еще немного поигрался с breqn и пришел к такому коду:

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\makeatletter
\exhyphenpenalty=\relpenalty
\relpenalty=13131
\binoppenalty=14141
\def\rel@break#1#2#3{%
  #1#2{#3}%
  \penalty-\@M%
  \mkern\eq@binoffset%
  #1#2{#3}
}
\def\bin@break#1#2#3{%
  \ifnum\lastpenalty=\z@%
    \discretionary{\hbox{$\m@th\displaystyle#1#2{#3}$}}{}{}%
    \penalty\binoppenalty%
  \fi%
  \EQ@prebin@space%
  #1#2{#3}%
}
\def\*{%
  \setbox\z@
  \hbox{\mathsurround\z@$\mkern\eq@binoffset$}
  \mathchoice{%
      \discretionary{\hbox{$\m@th\displaystyle\times$}}{\hbox{\kern\the\wd\z@$\m@th\displaystyle\times$}}{}%
    }{%
      \discretionary{\hbox{$\m@th\textstyle\times$}}{\hbox{$\m@th\textstyle\times$}}{}%
    }{%
      \discretionary{\hbox{$\m@th\scriptstyle\times$}}{\hbox{$\m@th\scriptstyle\times$}}{}%
    }{%
      \discretionary{\hbox{$\m@th\scriptscriptstyle\times$}}{\hbox{$\m@th\scriptscriptstyle\times$}}{}%
    }%
  \thinspace%
  \penalty\binoppenalty%
}
\makeatother
 


Т.е. отношения всегда разбивают формулу на строки, а бинарные операции - "по ситуации". Не идеально, но это, видимо, лучшее, чего можно достичь.

 
 
 
 Re: Breqn Дублирование знаков мат. операций при переносе
Сообщение05.04.2020, 14:23 
Аватара пользователя
dryabov в сообщении #1451532 писал(а):
Очевидно, что с выделенными формулами такой трюк не сработает.

Очевидно?
    Munin в сообщении #1437430 писал(а):
    Берёте выключную формулу, а внутрь неё вставляете внутритекстовую. А она автоматически разобьётся.

 
 
 [ Сообщений: 22 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group