LINUX.ORG.RU

Ломаются ссылки в заголовках Rmarkdown

 , ,


0

1

Всем привет!

По работе считаю всякие опросники, считаю всякие анализы и делаю отчёты для респондентов. Захотелось сделать симпатично и покрасить документ в цвета организации. Проблема в том, что средствами Markdown покрасить заголовки не выйдет, поэтому пошёл искать на стаке ответов. Чаще всего, если нельзя сделать что-то средствами маркдаун, пользователи предлагают использовать ещё и латех. Нашёл нужных параметров, всё покрасил, выглядит как и хотелось, но есть проблема - при экспорте в pdf стали неправильно работать ссылки в оглавлении. Жмякаешь на нужный раздел оглавления и попадаешь на неправильную страницу. Экспорт нужен именно в pdf. Если убрать параметры латеха и оставить заголовки в чб, то оглавление работает прекрасно.

Совершенно не понимаю как решить эту проблему. В латехе понимаю примерно ничего, чтобы даже прикинуть куда копать с этим. Слышал, что самый козырный вариант - изначально подготовить шаблон в латехе, а потом использовать его для документов markdown по-умолчанию, но пока совершенно не успеваю разобраться. Ниже привожу всю разметку, которую использовал в заголовке документа. Проблема в использовании titlesec. Можно ли покрасить заголовки как-то иначе?

---
title: |
  ![](think.png){width=5.5in}
lang: ru-RU
toc: TRUE
output:
  pdf_document:
    latex_engine: lualatex
mainfont: 'Stolzl book'
header-includes:
  \usepackage[utf8]{inputenc}
  \usepackage{fancyhdr}
  \usepackage{color}
  \definecolor{Brown}{RGB}{81,42,49} 
  
  \usepackage{titlesec}
  \definecolor{Brown}{RGB}{81,42,49}   

  \titleformat{\section}
  {\color{Brown}\normalfont\LARGE\bfseries}
  {\color{Brown}\thesection}{2em}{}
  
  \titleformat{\subsection}
  {\color{Brown}\normalfont\Large\bfseries}
  {\color{Brown}\thesubsection}{1em}{}
  
  \titleformat{\subsubsection}
  {\color{Brown}\normalfont\large\bfseries}
  {\color{Brown}\thesubsubsection}{}{}      
   
  \pagestyle{fancy}   
  \addtolength{\headheight}{1cm}   
  \lhead{\includegraphics[width=4cm]{logo.PNG}}
  \pagenumbering{arabic}
  
---

Сама по себе преамбула вполне рабочая, и способ раскрашивания заголовков весьма разумный. Я попробовал ее в обычном документе article, добавил в конце \usepackage{hyperref}, в результате ссылки в содержании ведут куда надо.

По-видимому, дело в каких-то дополнительных пакетах/настройках, которые вставляет R. Надо смотреть на LaTeX, сгенерированный R, возможно из него будет понятнее, что и как подправить. Как некую догадку могу предположить, что твой кусок преамбулы вставляется после \usepackage{hyperref} и ломает изменения, которые hyperref внес для поддержки ссылок.

TeopeTuK ★★★★ ()
Ответ на: комментарий от TeopeTuK

Класс! Есть куда копать теперь. Большое спасибо!

kirich ()
Ответ на: комментарий от TeopeTuK

Хм, попробовал добавить hyperref в разные места преамбулы, но изменений не получил. Обратил внимание, что в процессе создаётся pdf, лог, а ещё файлы с расширением aux и toc. Очевидно, что toc - table of content. Внутри действительно оно. В самом начале документа говорят, что это \babel@toc {russian}{}. Файлик с расширением .aux, судя по всему, тоже содержит оглавление, но это больше похоже на латех. Ссылки на те же страницы.

kirich ()
Ответ на: комментарий от kirich

А можешь поискать еще и файл LaTeX, который генерится, и показать, если не жалко? На него посмотреть было бы полезно. Ну или выложи какой-нибудь минимальный код на R, для которого проблема воспроизводится. Я бы посмотрел.

TeopeTuK ★★★★ ()
Ответ на: комментарий от bookman900

Исходный тех выглядит не настолько комплексно, чтобы было совсем непонятно, но моих знаний явно не хватает)

kirich ()
Ответ на: комментарий от kirich

В коде довольно рано загружается пакет bookmark (или если его не существует, то hyperref). После этого переопределение всяких \section в titlesec действительно ломает букмарки. Попробуй вот такой хак: в самом конце твоей преамбулы добавь строки:

\makeatletter
\expandafter\let\csname ver@bookmark.sty\endcsname\relax
\makeatother
\usepackage{bookmark}

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

TeopeTuK ★★★★ ()
Ответ на: комментарий от TeopeTuK

В коде довольно рано загружается пакет bookmark (или если его не существует, то hyperref).

Rmarkdown ещё перед латех преамбулой имеет параметр toc: TRUE. Может, дело в этом? Я не уверен что за этим вызывается.

Попробовал добавить строки:

LaTeX Error: Command \bookmarksetup already defined. Or name \end… illegal, see p.192 of the manual.

kirich ()
Ответ на: комментарий от einhander

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

kirich ()
Ответ на: комментарий от kirich

Да, не работает. Я, оказывается, закомментировал ранний вызов \usepackage{bookmark}, и забыл вернуть обратно при тестировании.

Если нужно только раскрасить заголовки, то вот такой добавочек вместо использования titlesec вроде работает:

\makeatletter
\pretocmd\@sect{\bgroup\color{Brown}}{}{}
\apptocmd\@sect{\egroup}{}{}
\makeatother

Он добавляет в начало внутренней команды \@sect переключение на коричневый, и в конец – закрытие группы, чтобы цвет не прорвался дальше.

TeopeTuK ★★★★ ()
Ответ на: комментарий от TeopeTuK

Ого, сработало. Кайф! Большое вам спасибо! Кстати, а можете подсказать что-нибудь хорошее «популяризаторского» уровня по латеху? Серьёзно я точно не сяду, в ближайшие пару недель, а вот под еду посмотреть видос или глянуть текст, чтобы не нужно было слишком прям глубоко вчитываться/всматриваться? Чтобы базово разобраться в структуре документов и какие вообще популярные пакеты все используют.

kirich ()
Ответ на: комментарий от einhander

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

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

Короче, я для себя выяснил за пару дней, что ЛОР совершенно потрясающие место с шарящими и заинтересованными человеками и зря я сюда не заходил.

Большое спасибо всем за помощь и советы!

kirich ()
Ответ на: комментарий от kirich

Боюсь, что ничего не смогу посоветовать. Я давно не смотрел на туториалы и не знаю, какой из них сейчас можно считать хорошим. Из книжек мне очень нравится Gratzer «More math in LaTeX». Но там про стандартное использование латеха, в потроха он не лезет. Смутно вспоминается автор Nicola Talbot ещё.

TeopeTuK ★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)