2014 dxdy logo

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

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




 
 перенос формулы в текстовой моде
Сообщение21.03.2015, 21:46 
При автоматическом переносе формулы ТеХ выравнивает первый фрагмент до полного безобразия. Можно ли заставить его прижимать всё к краю строки?

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

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение22.03.2015, 00:06 
Аватара пользователя
Приведите пример, пожалуйста.

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение22.03.2015, 23:07 
Используется синтаксис LaTeX
$u(x,t)=\sum\limits_{k=0}^{\infty}\bigg[\left(\frac{24}{\pi^2(2k+1)^2}+
\frac{-448(-1)^k}{121\pi^3(2k+1)^3}\right)\,\cos\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t
+\sqrt{\frac{7}{5}}\cdot\frac{32(-1)^k-32\sin\frac{\pi(2k+1)}{3}}{11\pi^2(2k+1)^2}\sin\frac{11\sqrt{5}\,\pi(2k+1)}
{4\sqrt{7}}t+\frac{448(-1)^k}{121\pi^3(2k+1)^3}\bigg]\cos\frac{\pi(2k+1)x}{6}$
 

$u(x,t)=\sum\limits_{k=0}^{\infty}\bigg[\left(\frac{24}{\pi^2(2k+1)^2}+\frac{-448(-1)^k}{121\pi^3(2k+1)^3}\right)\,\cos\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t+\sqrt{\frac{7}{5}}\cdot\frac{32(-1)^k-32\sin\frac{\pi(2k+1)}{3}}{11\pi^2(2k+1)^2}\sin\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t+\frac{448(-1)^k}{121\pi^3(2k+1)^3}\bigg]\cos\frac{\pi(2k+1)x}{6}$

В одну строчку, естественно, никак не уместится. При автоматическом переносе ТеХ делает безумные пробелы. Разбить формулы на фрагменты вручную можно, конечно (окружив каждый фрагмент внутри фигурными скобками, и я, собственно, этот вариант и выбрал); но -- крайне уныло: я ведь их не вручную набивал, а генерировал. Причём не все формулы при генерации оказываются такими длинными, так что некоторые разбивать даже и как-то неприлично. Т.е. если формула всё-таки оказывается короткой, то видеть её разбитой -- раздражительно.

-- Пн мар 23, 2015 00:30:18 --

Если уж совсем любопытно, то исходная задачка была такой:

Используется синтаксис LaTeX
$
\begin{cases} u''_{tt}=\frac{5445}{28}\,u''_{xx}+5;\\
      u'_x\big|_{x=0}=0,\ \ \ u\big|_{x=3}=0;\\
      u\big|_{t=0}=3-x;\ \ \ u'_t\big|_{t=0}=\begin{cases}0 &\text{при } x<2,\\ 2 &\text{при } x\geqslant2.\end{cases}\end{cases}
$
 

$\begin{cases} u''_{tt}=\frac{5445}{28}\,u''_{xx}+5;\\ u'_x\big|_{x=0}=0,\ \ \ u\big|_{x=3}=0;\\ u\big|_{t=0}=3-x;\ \ \ u'_t\big|_{t=0}=\begin{cases}0 &\text{при } x<2,\\ 2 &\text{при } x\geqslant2.\end{cases}\end{cases}$

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

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение23.03.2015, 16:44 
Аватара пользователя
ewert в сообщении #994308 писал(а):
При автоматическом переносе ТеХ делает безумные пробелы.

Вы имеете в виду пробел в первой строчке перед $u(x,t)$?

Можно сделать так:

\noindent $u(x,t)=\sum\limits_{k=0}^{\infty}\bigg[\left(\frac{24}{\pi^2(2k+1)^2}+
\frac{-448(-1)^k}{121\pi^3(2k+1)^3}\right)\,\cos\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t
+\sqrt{\frac{7}{5}}\cdot\frac{32(-1)^k-32\sin\frac{\pi(2k+1)}{3}}{11\pi^2(2k+1)^2}\sin\frac{11\sqrt{5}\,\pi(2k+1)}
{4\sqrt{7}}t+\frac{448(-1)^k}{121\pi^3(2k+1)^3}\bigg]\cos\frac{\pi(2k+1)x}{6}$

Используется синтаксис LaTeX
\noindent $u(x,t)=\sum\limits_{k=0}^{\infty}\bigg[\left(\frac{24}{\pi^2(2k+1)^2}+
\frac{-448(-1)^k}{121\pi^3(2k+1)^3}\right)\,\cos\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t
+\sqrt{\frac{7}{5}}\cdot\frac{32(-1)^k-32\sin\frac{\pi(2k+1)}{3}}{11\pi^2(2k+1)^2}\sin\frac{11\sqrt{5}\,\pi(2k+1)}
{4\sqrt{7}}t+\frac{448(-1)^k}{121\pi^3(2k+1)^3}\bigg]\cos\frac{\pi(2k+1)x}{6}$


Команда \noindent может стоять или в начале абзаца, или в преамбуле документа.
Львовский С. М. Набор и вёрстка в системе LaTeX.
Параграфы III.9.2, III.7.6, I.2.9; II.2.2.

ewert в сообщении #994308 писал(а):
Разбить формулы на фрагменты вручную можно, конечно (окружив каждый фрагмент внутри фигурными скобками, и я, собственно, этот вариант и выбрал); но -- крайне уныло: я ведь их не вручную набивал, а генерировал.

Увы, кажется, это единственный "торный путь" для красивого разбиения формул на строки. TeX даёт много возможностей верстать вручную, но мало - для автоматической генерации. Может быть, есть какой-то пакет, не знаю.

Более того, перенос формул вручную - часто дело вынужденное. В математической типографике есть несколько правил переноса, которые TeX автоматически делать не умеет:
- при переносе знака отношения или бинарной операции, он дублируется на следующей строке (это в русской традиции, а не в американской);
- при переносе по умножению (которое написано без знака), добавляется знак умножения - обычно $\times,$ но по смыслу может и $\cdot$ ; косую дробную черту не переносят;
- при разных возможностях переноса, разбивать формулу лучше вне скобок, чем внутри; это же относится к выражениям под знаком суммы, интеграла и т. п.;
- при переносе горизонтальной дробной черты (если без этого не обойтись) можно использовать специальную нотацию (в русской традиции):
$$\begin{aligned}&\dfrac{\text{начало числителя}+{}}{\quad\text{начало знаменателя}-{}\quad}\to\\&\leftarrow\dfrac{{}+\text{конец числителя}}{\quad{}-\text{конец знаменателя}\quad}\end{aligned}$$ - при переносе большого радикала, его придётся заменить на $(\text{подкоренное выражение})^{1/2}$; (сделать аналогичные стрелочки в TeX-е затруднительно, хотя принципиально можно);
- рекомендуются отступы, визуально показывающие место оператора в начале новой строки, по отношению к предыдущей строке:
\noindent $\begin{aligned}\textstyle u(x,t)=&\textstyle \left(\frac{24}{\pi^2(2k+1)^2}+
\frac{-448(-1)^k}{121\pi^3(2k+1)^3}\right)\,\cos\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t
+\sqrt{\frac{7}{5}}\cdot\frac{32(-1)^k-32\sin\frac{\pi(2k+1)}{3}}{11\pi^2(2k+1)^2}\sin\frac{11\sqrt{5}\,\pi(2k+1)}
{4\sqrt{7}}t+{} \\ &\textstyle {}+\frac{448(-1)^k}{121\pi^3(2k+1)^3}\end{aligned}$

\noindent $\begin{aligned}\textstyle u(x,t)=\sum\limits_{k=0}^{\infty}\bigg[&\textstyle \left(\frac{24}{\pi^2(2k+1)^2}+
\frac{-448(-1)^k}{121\pi^3(2k+1)^3}\right)\,\cos\frac{11\sqrt{5}\,\pi(2k+1)}{4\sqrt{7}}t
+\sqrt{\frac{7}{5}}\cdot\frac{32(-1)^k-32\sin\frac{\pi(2k+1)}{3}}{11\pi^2(2k+1)^2}\sin\frac{11\sqrt{5}\,\pi(2k+1)}
{4\sqrt{7}}t+{} \\ &\textstyle {}+\frac{448(-1)^k}{121\pi^3(2k+1)^3}\bigg]\cos\frac{\pi(2k+1)x}{6}\end{aligned}$

(Ссылки:
1. Swanson E., O'Sean A., Schleyer A. Mathematics into type.
2. https://ru.wikipedia.org/wiki/Перенос_(типографика)
)

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение23.03.2015, 22:03 
Munin в сообщении #994568 писал(а):
- рекомендуются отступы,

Мне не нужно, чтоб было красиво, тем более чтоб "типографически" кто-то что-то рекомендовал. Мне нужно, чтоб было комфортно читать. Мне лично, или ещё каким преподам, если им вдруг понадобится для своих сугубо зловредных преподских целей.

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

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

-- Пн мар 23, 2015 23:23:03 --

(Оффтоп)

Munin в сообщении #994568 писал(а):
Команда \noindent может стоять или в начале абзаца, или в преамбуле документа.

Она ровно в начале абзаца и стояла. Я ж лишь существенный фрагмент привёл. А разделялись те фрагменты макрокомандами, включающими в себя, помимо прочего, ещё и всякие \vskip'ы вперемешку с \hrule'ми. Код-то был отладочный.

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


-- Вт мар 24, 2015 00:01:13 --

Munin в сообщении #994568 писал(а):
Вы имеете в виду пробел в первой строчке перед $u(x,t)$?

А, да. Нет, не в этом проблема, естественно. Ладно бы выравнивание слева или справа; и то, и другое было бы вполне приемлемо. Проблема в том, что ТеХ, зараза, вытягивает выравнивание на всю строку.

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение23.03.2015, 23:52 
Аватара пользователя
ewert в сообщении #994748 писал(а):
Проблема в том, что ТеХ, зараза, вытягивает выравнивание на всю строку.

Всё-таки не понимаю. Пальцем ткните. Где это - в том примере, который вы привели?

ewert в сообщении #994748 писал(а):
Мне не нужно, чтоб было красиво

Ну извините, это я "отступление в сторону" сделал, не принимайте на свой счёт.

-- 24.03.2015 00:23:25 --

ewert в сообщении #994748 писал(а):
Чтобы при сверке студенческих ответов с ответом фактическим глаза не разбегались на всю ширину страницы. А это значит, что при автоматическом переносе строки паразитно-выравнивающие пробелы внутри неё должны обязательно подавляться.

Вот на эту тему в Львовском вам могут пригодиться перечисленные параграфы и их окрестности. Например, там упомянута команда \raggedright, которая делает абзац "выравненным влево", и все растянутые пробелы - по минимуму.

Либо по Кнуту, кажется, можно переопределить вот эти определения:
в преамбуле на другие, без частей plus и minus - тогда они будут нерастяжимы и несжимаемы.

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение24.03.2015, 23:23 
Munin в сообщении #994803 писал(а):
там упомянута команда \raggedright, которая делает абзац "выравненным влево"

Да, это ровно то, что нужно, спасибо (у меня просто никогда не возникало потребности выравнивать по краю, а то, что в стандарте не могут не быть предусмотрены для этого средства -- как-то в голову не пришло). Однако одна существенная проблема остаётся. Хотелось бы иметь возможность управлять желательными точками переноса. Или хотя бы запретить переносить по \cdot.

-- Ср мар 25, 2015 00:37:47 --

А, Вы там намекали ещё на группировку. Тогда да, это приемлемо, вопрос снимается.

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение25.03.2015, 13:08 
Аватара пользователя
ewert в сообщении #995200 писал(а):
Однако одна существенная проблема остаётся. Хотелось бы иметь возможность управлять желательными точками переноса. Или хотя бы запретить переносить по \cdot.

На эту тему я ссылался на Львовского параграф II.2.2 - переносы в математических формулах. Но там сложно для меня написано, и я не могу дать конкретного совета. Кроме того, ключевые слова оттуда - можно искать в Кнуте, и погрузиться ещё глубже в технические детали и возможности.

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение25.03.2015, 21:23 

(Оффтоп)

Munin в сообщении #995374 писал(а):
На эту тему я ссылался на Львовского параграф II.2.2

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

 
 
 
 Re: перенос формулы в текстовой моде
Сообщение25.03.2015, 22:56 
Аватара пользователя
Окей, я тогда ещё раз даю вам эту ссылку. Может быть, там будет ещё что-то полезное, что я не пересказал здесь.

 
 
 [ Сообщений: 10 ] 


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