Виділення вихідного коду в LaTeX


196

Мені потрібно виділити вихідний код у LaTeX. Пакет, listingsздається, є найкращим вибором для більшості випадків використання, і для мене це було досі.

Однак зараз мені потрібна більша гнучкість. Взагалі те, що я шукаю, - це справжній лексер. Зокрема, мені потрібно (для власного визначення мови) визначити (і виділити!) Власні стилі чисел. listingsне дозволяє виділити числа в коді. Однак мені потрібно створити щось подібне:

Необхідний результат

listingsтакож не може впоратися з довільними роздільниками для рядків. Розглянемо наступний дійсний код Ruby:

s = %q!this is a string.!

Тут !можна замінити практично будь-який роздільник.

(Це listingsне вдається вирішити Unicode також дуже неприємно, але це інша проблема.)

В ідеалі я шукаю розширення, listingsяке дозволяє мені надати більш складні правила лексингу. Але забороняючи це, я також шукаю життєздатні альтернативи.

Інші потоки запропонували використовувати Pygments, які можуть виробляти вихід LaTeX. Є навіть пакет - texments- щоб полегшити перехід.

Однак у цьому гостро не вистачає можливостей. Зокрема, мене цікавлять listingsнумерація рядків -style, посилання на рядок вихідного коду та можливість вбудовування LaTeX у вихідний код (параметри texclта mathescapeв listings).

Як приклад, ось набір вихідного коду, в listingsякому показано деякі речі, які також повинна забезпечувати заміна:

Приклад списків LaTeX: додавання в бік ["Бічне доповнення", змінене з біт-твінглінг-хаків]


якщо ви не бажаєте використовувати зовнішні інструменти, такі як пігменти, то чому б просто не написати файл файлу для свого документа?
Слюда

6
Чи не слід це перенести на tex.stackexchange.com ? ^^
Маттіас

1
@Matthias Не впевнений. Коли я опублікував це, там не було tex.se, але зараз це здається досить корисним - питання мало величезне відлуння, тоді як на TeX.SE ніхто поки не писав подібного питання. Крім того, це насправді стосується конкретно програмних засобів та програм програмування, тому я думаю, що програмісти - це люди, які отримують від цього користь.
Конрад Рудольф

1
Для тих, хто може забути LaTeX для документа, який вони зараз пишуть: Зауважте, що з Office Word або LibreOffice Writer ви просто копіюєте / вставляєте свій код з, наприклад, Eclipse туди і зберігаєте свої кольори !!
MohamedEzz

3
@MemoryLeaks Я не впевнений, кому ця порада страшенно корисна: Офісне програмне забезпечення не є дійсною заміною LaTeX (що не є офісним програмним забезпеченням, це настільна видавнича система, що, у двох словах, означає, що вона забезпечує значно кращу типографіку , крім усіх інших його переваг перед офісним програмним забезпеченням).
Конрад Рудольф

Відповіді:


355

Прислухаючись до порад Нормана, я зламав рішення, яке використовувало ( виправлене ) Пігменти для виділення і ввімкнуло якомога більше функцій, не лопнувши ;-)

Я також створив пакет LateX, як тільки мій патч Pygmens був випущений у версії 1.2 ...

Представлення карбування

карбувалися є пакетякий використовує Pygments забезпечити першокласну підсвічування синтаксису в LaTeX. Наприклад, він дозволяє наступний вихід.

прикладний приклад LaTeX

Ось мінімальний файл для відтворення вищевказаного коду (зауважте, що, включаючи символи Unicode, може знадобитися XeTeX)!

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{minted}

\setsansfont{Calibri}
\setmonofont{Consolas}

\begin{document}
\renewcommand{\theFancyVerbLine}{
  \sffamily\textcolor[rgb]{0.5,0.5,0.5}{\scriptsize\arabic{FancyVerbLine}}}

\begin{minted}[mathescape,
               linenos,
               numbersep=5pt,
               gobble=2,
               frame=lines,
               framesep=2mm]{csharp}
  string title = "This is a Unicode π in the sky"
  /*
  Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter
  of an $n$-sided regular polygon circumscribing a
  circle of diameter $d$.
  */
  const double pi = 3.1415926535
\end{minted}
\end{document}

Це можна встановити за допомогою наступної команди:

xelatex -shell-escape test.tex

(Але чеканка також працює з latexі pdflatex...)

minted.styпрацює аналогічно, texments.styале дозволяє отримати додаткові функції.

Як це отримати

Ще раз дякую Норману за те, що мотивував мене виробляти цей пакет.


19
Після годин пошуку того, як використовувати пігменти з LaTeX, і більше годин спроб зламати моє власне рішення, це найкраще, що я знайшов. А ще краще - це насправді працює. Дякую за це
sykora

2
тут просто щоб оцінити роботу, яку ви зробили стаючим чином;)!
Філіп Дупанович

4
@Paul: Це правда, що вся справа в Windows досить безладна. :-( Сподіваємось, наступна версія Pygmens дещо полегшить це, але для людей, які часто не працюють з Python (і, отже, easy_install), процес ніколи не буде дуже гладким.
Конрад Рудольф,

1
На сайті TeX SE зараз є досить багато запитань щодо вашого пакету , і я просто потрапив на один із своєрідним запитом на функції (прихований у коментарях) . Можливо, ви захочете поглянути.
Paŭlo Ebermann

1
@ Paŭlo Дякую Я намагаюся прочитати всі згадки про пакет (я отримую попередження від Google), але мені це не завжди вдається. Питання, яке ви згадали, я насправді прочитав (мабуть: я його схвалив, але не можу згадати), але це зовсім не просто. "Ab", використовуючи TikZ для цього, здається, поганим злом ...
Konrad Rudolph

6

TeX є (знаменито) завершеним Тьюрінгом, але я впевнений, що вам доведеться писати це розширення самостійно. З документації видно, що оригінальний автор listingsосиротів його в 2004 році, і він не оновлювався з 2006 року. Пакет не був розроблений таким чином, щоб замінити форматування числових літералів, але ви можете змінити його, змінивши визначення \lst@ProcessDigit. Якщо це не працює, вам доведеться детально розібратися в тому, як працюють параметри "стилю ідентифікатора", і вам доведеться дублювати цю техніку для ваших числових літералів.

Я не зовсім розумію, чому ви так неохоче впроваджуєте зовнішній інструмент у свій інструментарій, але, оскільки ви є, вам доведеться зайву роботу. Подивившись на вихідний код, я сподіваюся, що модифікація listingsповинна бути можливою, але я особисто вирішив би попередньо обробити свій LaTeX.


Я зовсім не бажаю впроваджувати зовнішні інструменти - адже я думаю, що використання Pygmens - це, мабуть, найкраще рішення. Питання в тому, як це зробити розумним способом, щоб я все-таки мав можливість уникнути LaTeX і \labels всередині коду.
Конрад Рудольф

Щодо змін listings, я вже подивився на його джерело - і, на жаль, я його зовсім не розумію. Мої навички TeX ніде не знаходяться на цьому рівні. До сих пір я все-таки використовував лише підмножину LaTeX TeX.
Конрад Рудольф

1
Я б сказав, що найбільша проблема із впровадженням зовнішнього інструменту полягає в тому, що якщо ви публікуєте. Дуже багато видавців журналів (кашель SPRINGER та ін.) Вимагають подання у сирому LaTex, який потім збирається на їх серверах. Потрібно сказати, що якщо ваш сторонній інструмент не є на їх сервері, ви є SOL, якщо ви не попередньо обробляєте (що втрачає більшість корисних можливостей, щоб дозволити Tex Drive).
Namey

Якщо документація правильна, пакет списків все ще підтримується - проте сервіс
DetlevCM

1
@Namey, лише точка даних: мені вдалося успішно прокрасти папір, використовуючи mintedпроцес публікації LNCS Springer.
Волкер Столц

3

Це пакет, який перетворює вихідний код на TeX і LaTeX з підсвічуванням синтаксису. Можна легко додавати спеціальні визначення мови програмування.

Highlight підтримує 100 мов програмування та включає 50 кольорових тем. У ньому є переформатування коду та відступ коду.

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


1
highlightвсе ж поділяє всі проблеми Пігментів. Зокрема, це не пакет LaTeX , незважаючи на те, що говорить його опис. Це просто автономна програма. Проблема, як і в Pygmens, полягає в тому, як використовувати її значущо зсередини LaTeX і надавати всі приємні речі listings.
Конрад Рудольф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.