Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Настройки cleveref #496

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

ScumCoder
Copy link

PR checklist

Пожалуйста, убедитесь, что Ваш PR удовлетворяет требованиям:

  • [✓] Изменения были протестированы (make examples)
  • Изменения отражены в документации к шаблону
  • [✓] Код соответствует правилам индентации шаблона (make indent)

Тип PR

Отметьте графы, которые относятся к данному PR:

  • [✓] Bugfix
  • Feature
  • Форматирование стиля кода
  • Изменение текста шаблона
  • Изменение документации
  • Другое:

Описание PR

Настройки cleveref в common/styles.tex:

  • состояли из однотипной копипасты (=> тяжело читать, тяжело поддерживать)
  • не включали в себя настройку заглавных версий (Cref), соответственно \Cref падала с ошибкой
  • не включали в себя настройку отрисовки диапазонов внутри списков, соответственно данный случай отрисовывался по умолчанию (с приставкой)

Смежные обсуждения

Данный PR закрывает issue:

Тестирование шаблона

Тестирование производилось в среде

  • Windows
  • Windows Cygwin
  • GNU/Linux (на основе Debian)
  • [✓] GNU/Linux (на основе SuSE)
  • Arch Linux
  • Docker (ссылка на контейнер):

Другая информация

При низкоуровневом переопределении cref, автоматические определения для Cref будут неявно сгенерированы при помощи MakeUppercase только тогда, когда заданное тело cref начинается с буквы (см. texdoc cleveref).
Т.к. в нашем случае оно начинается с кода ссылки, этот код уродуется MakeUppercase’ом, в результате чего использование \Cref приводит к падению с ошибкой.
Соответственно, \Cref необходимо переопределять вручную.
По непонятной причине четвёртый тип низкоуровневых настроек — применяемый при отрисовке диапазонов внутри списков, — отсутствовал в common/styles.
В результате при передаче \cref ссылок A, B, C и E (в предположении что в тексте эти элементы идут в порядке «A, B, C, D, E») активировался код отрисовки по умолчанию (и соответственно добавлялась приставка).
@@ -165,7 +165,7 @@

%%% Изображения %%%
\usepackage{graphicx}[2014/04/25] % Подключаем пакет работы с графикой
\usepackage{caption} % Подписи рисунков и таблиц
%\usepackage{caption} % Подписи рисунков и таблиц; starting with version 1.4 the subcaption package [...] loads [the caption package] automatically © texdoc subcaption.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Руководствуясь максимой «explicit is better than implicit», я бы оставил эту строку

Copy link
Collaborator

@Lenchik Lenchik Nov 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо, что подсветили.
Я бы тут тоже, дочитав до этого места, оставил бы как было.
У меня тут машинка есть с пакетом не таким новым

(c:/texlive/2018/texmf-dist/tex/latex/caption/subcaption.sty
Package: subcaption 2018/05/01 v1.1-162 Sub-captions (AR)

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

EDIT:
Запустил на той машинке. Не падает. И Cref вызов как будто тоже работает.

Comment on lines +75 to +103
\newcommand*{\SCSetCrefFormatBase}[2]{\csname #1format\endcsname{#2}} % имя настройки, тип ссылки
\newcommand*{\SCSetCrefLabelcrefFormats}[3]{% подимя настройки, тип ссылки, формат
\SCSetCrefFormatBase{cref#1}{#2}{#3}% ссылка с приставкой
\SCSetCrefFormatBase{Cref#1}{#2}{#3}% ссылка с приставкой, стоящая в начале предложения
\SCSetCrefFormatBase{labelcref#1}{#2}{#3}% ссылка без приставки
}
\newcommand*{\SCSetCrefLabelcrefMultiFormats}[6]{% подимя настройки, тип ссылки, формат x4
\SCSetCrefFormatBase{cref#1}{#2}{#3}{#4}{#5}{#6}% ссылка с приставкой
\SCSetCrefFormatBase{Cref#1}{#2}{#3}{#4}{#5}{#6}% ссылка с приставкой, стоящая в начале предложения
\SCSetCrefFormatBase{labelcref#1}{#2}{#3}{#4}{#5}{#6}% ссылка без приставки
}
\newcommand*{\SCSetCrefLabelcrefFormatsForType}[3]{% тип ссылки, символ слева от ссылки, символ справа от ссылки
\SCSetCrefLabelcrefFormats{}{#1}{#2##2##1##3#3}% одиночная ссылка
\SCSetCrefLabelcrefFormats{range}{#1}{#2##3##1##4#3 \cyrdash~#2##5##2##6#3}% диапазон ссылок
\SCSetCrefLabelcrefMultiFormats{multi}{#1}{#2##2##1##3#3}{ и~#2##2##1##3#3}{, #2##2##1##3#3}{ и~#2##2##1##3#3}% перечисление ссылок
\SCSetCrefLabelcrefMultiFormats{rangemulti}{#1}{#2##3##1##4#3 \cyrdash~#2##5##2##6#3}{#2##3##1##4#3 \cyrdash~#2##5##2##6#3}{#2##3##1##4#3 \cyrdash~#2##5##2##6#3}{#2##3##1##4#3 \cyrdash~#2##5##2##6#3}% диапазон ссылок внутри перечисления ссылок
}
\newcommand*{\SCSetCrefLabelcrefFormatsForTypeSimple}[1]{\SCSetCrefLabelcrefFormatsForType{#1}{}{}}
\newcommand*{\SCSetCrefLabelcrefFormatsForTypeParen}[1]{\SCSetCrefLabelcrefFormatsForType{#1}{(}{)}}

% Листинг
\crefformat{ListingEnv}{#2#1#3} % одиночная ссылка с приставкой
\labelcrefformat{ListingEnv}{#2#1#3} % одиночная ссылка без приставки
\crefrangeformat{ListingEnv}{#3#1#4 \cyrdash~#5#2#6} % диапазон ссылок с приставкой
\labelcrefrangeformat{ListingEnv}{#3#1#4 \cyrdash~#5#2#6} % диапазон ссылок без приставки
\crefmultiformat{ListingEnv}{#2#1#3}{ и~#2#1#3}{, #2#1#3}{ и~#2#1#3} % перечисление ссылок с приставкой
\labelcrefmultiformat{ListingEnv}{#2#1#3}{ и~#2#1#3}{, #2#1#3}{ и~#2#1#3} % перечисление без приставки
\SCSetCrefLabelcrefFormatsForTypeParen{equation}
\SCSetCrefLabelcrefFormatsForTypeParen{subequation}
\SCSetCrefLabelcrefFormatsForTypeSimple{chapter}
\SCSetCrefLabelcrefFormatsForTypeSimple{section}
\SCSetCrefLabelcrefFormatsForTypeSimple{appendix}
\SCSetCrefLabelcrefFormatsForTypeSimple{figure}
\SCSetCrefLabelcrefFormatsForTypeSimple{table}
\SCSetCrefLabelcrefFormatsForTypeSimple{lstlisting}
\SCSetCrefLabelcrefFormatsForTypeSimple{ListingEnv}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

На мой взгляд, это изменение следует убрать.

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

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

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Согласен, читаемость прям сильно пострадала (не могу сказать, что раньше была хорошей, но как будто лучше чем в новом варианте). Всякие ООП приколы с наследованиями... уух 🤯
labelcrefrangeformat и подобные хотя бы из самого пакета cleveref, при желании разобраться, люди могут нагуглить откуда это и что, а вот SCSetCrefLabelcrefMultiFormats это же местное создание, с которым лет через пять и не разберешься...
Может быть, сможете собрать лучшее из всех миров? Сделать одну-две заготовки, которые не будут плодить копипасту, но прям хорошо управляемые и документированы. Я бы хотел сказзать, что "давайте вместе подумаем/поделаем" но тут прям очень тяжелое для восприятия получилось. Раньше хоть блоки по три отсылки типа #2#1#3, а теперь блоки по несколько, сиди гадай когда там один #, а когда два ставить: {#1}{#2##3##1##4#3.

@@ -52,6 +52,7 @@ \section{Длинное название параграфа, в котором
\end{figure}

На рисунке~\cref{fig:knuth_2-1} показан Дональд Кнут без головного убора.
%\Cref{fig:knuth_2-1} показывает Дональда Кнута без головного убора.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут как будто это просто работает по принципу "не падает". Может быть, сделаете какой-то пример, где будет использоваться как раз возможность из cleveref, что \Cref предназначен для вставки в начало предложения? Как раз может получиться какая-то заготовка для тех случаев, когда хотят, чтобы к рисункам и таблицам были ссылки вида Рисунок 5.5б или в Таблице 25 (как описано в конце https://github.com/AndreyAkinshin/Russian-Phd-LaTeX-Dissertation-Template/wiki/Customization#%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D1%80%D0%B8%D1%81%D1%83%D0%BD%D0%BA%D0%BE%D0%B2-%D0%B8-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86).

\crefmultiformat{lstlisting}{#2#1#3}{ и~#2#1#3}{, #2#1#3}{ и~#2#1#3} % перечисление ссылок с приставкой
\labelcrefmultiformat{lstlisting}{#2#1#3}{ и~#2#1#3}{, #2#1#3}{ и~#2#1#3} % перечисление без приставки
\newcommand*{\SCSetCrefFormatBase}[2]{\csname #1format\endcsname{#2}} % имя настройки, тип ссылки
\newcommand*{\SCSetCrefLabelcrefFormats}[3]{% подимя настройки, тип ссылки, формат
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

подимя если это калька с subname, то правильней писать "подымя"

@@ -39,7 +39,10 @@
}

%%% Подписи подрисунков %%%
\DeclareCaptionSubType{figure}

% "For the environments figure & table [...] this [вызов \DeclareCaptionSubType] will be done automatically" © texdoc subcaption
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это с какой версии?

@@ -282,6 +282,8 @@ \subsection{Нумерованные формулы}\label{subsec:ch1/sec3/sub3}
\end{align}
\end{subequations}

Список ссылок сортируется, после чего (по возможности) схлопывается до диапазонов: \cref{eq:equation2,eq:2p3,eq:subeq_2,eq:equation1,eq:subeq_1}.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хороший пример, интересный. Пригодится в любом случае. Но вот почему, если его вставить в старый код, то соберется тире без отбития пробелов (может так более правильно, хорошо бы ГОСТ по этому поводу найти), а с новым - с отбитием пробелами (ф-л. это видать заготовка под ф
ормул, как будто лишняя, действительно)?

old001

new001

Copy link
Collaborator

@Lenchik Lenchik Nov 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rangemulti что ли там по-другому пробелы отрабатывает, или отсутствие ф-л. всё растянуло 🤔

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants