LINUX.ORG.RU

Почему в \newenvironment не работает?

 


1

1

Всем привет!

Нашел чудесный пакет minted, который подсвечивает код. Одна беда: не работает с кириллицей. Но, отыскался патч, который это решает.

Но у меня minted засовывается в \newenvironment . Так вот, непатченый minted - все отлично. А вот патченый отдельно работает, а в \newenvironment пишет:

File ended while scanning use of \FancyVerbGetLine

Чего ему нужно?

\documentclass[a4paper,10pt]{book}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[english,russian]{babel}

\usepackage{minted}

%%%%%%%%%%%%%%% Сам патч
\makeatletter
\newcommand{\minted@write@detok}[1]{%
  \immediate\write\FV@OutFile{\detokenize{#1}}}%

\newcommand{\minted@FVB@VerbatimOut}[1]{%
  \@bsphack
  \begingroup
    \FV@UseKeyValues
    \FV@DefineWhiteSpace
    \def\FV@Space{\space}%
    \FV@DefineTabOut
    %\def\FV@ProcessLine{\immediate\write\FV@OutFile}% %Old, non-Unicode version
    \let\FV@ProcessLine\minted@write@detok %Patch for Unicode
    \immediate\openout\FV@OutFile #1\relax
    \let\FV@FontScanPrep\relax
%% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures)
    \let\@noligs\relax
%% DG/SR modification end
    \FV@Scan}
    \let\FVB@VerbatimOut\minted@FVB@VerbatimOut

\renewcommand\minted@savecode[1]{
  \immediate\openout\minted@code\jobname.pyg
  \immediate\write\minted@code{\expandafter\detokenize\expandafter{#1}}%
  \immediate\closeout\minted@code}
\makeatother
%%%%%%%%%%%%%%% Конец патча

\newenvironment{code}{
	\begin{VerbatimOut}{\jobname.pyg}}
{
	\end{VerbatimOut}
	\minted@pygmentize{с++}
	\DeleteFile{\jobname.pyg}
}

\begin{document}

%%%%%%%%%%%%%% Это работает
\begin{minted}{c}
double m[4];    // Работает
m[0] = 1;
double *n = (double *) malloc(pocet_cisel * 4 * sizeof (double));
n[4 + 0] = 1;
free(n);
\end{minted}
%%%%%%%%%%%%%% 

%%%%%%%%%%%%%% А вот это не работает
\begin{code}
double m[4];    // Работает
m[0] = 1;
double *n = (double *) malloc(pocet_cisel * 4 * sizeof (double));
n[4 + 0] = 1;
free(n);
\end{code}
%%%%%%%%%%%%%%

\end{document}
★★★★★

Кстати, в \newcommand{\minted@FVB@VerbatimOut}[1]{ не нужно ли \global ко всем определениям поприписывать?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Evgueni

А, про хрюникод я не подумал. У меня-то с КОИ8-Р проблем нет...

А стили раскрашивания запросто можно настроить в listings

Eddy_Em ☆☆☆☆☆
()

Кстати, а нафига в листингах кириллица? Раскрашивать примеры с кусками латеховского кода?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Kroz

Я имел в виду, что патч для mined для работы с latex/pdflatex. Так как с xelatex оно должно работать из коробки.

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

С koi8-r могут быть другие проблемы, например в TeXLive 2013 выкинули символ \No, которого нет в koi8-r. И подобные мелочи будут накапливаться.

Evgueni ★★★★★
()
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

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

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

Знаю, пришлось делать \def\No{\textnumero}. Извращенцы! Хоть бы о поддержке старых исходников думали!!!

Таких "новаторов" надо отлавливать и на новый год за ноги на ЛЭП развешивать вместо гирлянд.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Evgueni

К сожалению, нет законов, лишающих гражданских прав уродов вроде Поцтеринга!

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

А чем тебе lstlisting не нравится?

С юникодом там грустно

Кстати, а нафига в листингах кириллица?

printf("Введите ваши данные: ");

А в твоих патчах, вполне возможно, где-то завалялись «хрупкие» команды.

Здесь вообще скорее вопрос в том, как дебаггинг делать. Вот я заглядывал в minted.sty, пытался разобраться что этот патч делает - не понял.

Больше всего меня ставит в ступор в патче команды \newcommand. То есть не \renewcommand, а именно \newcommand ; притом что я не замечал где они в явном виде используются.

И еще я не понял что делает \detokenize . Гуглил, но так и не понял в каких случаях это нужно, что конкретно делает, и зачем оно здесь. Подскажи или ткни носом в нормальный мануал.

Еще чую тайную связь между \detokenize и объявлениями \newcommand.

Кстати, в \newcommand{\minted@FVB@VerbatimOut}[1]{ не нужно ли \global ко всем определениям поприписывать?

Можно финальный вариант, как должно выглядеть. Я пока с вот этими вещами... только начинаю.

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

И еще я не понял что делает \detokenize

Это — чисто теховская команда, которая разбивает на токены свой аргумент. Т.е. результатом \detokenize{\some{command}} будет набор токенов: \,s,o,m,e,{,c,o,n,n,a,n,d и }. В ряде случаев она нужна (например, при обработке того, что ты хочешь запихнуть в файл, который затем заинклюдишь).

Читай "Все про ТеХ" Кнута. Как ты без ее чтения латехом занимаешься — я не понял.

Можно финальный вариант, как должно выглядеть.

Знал бы я, что эти волшебные действа значат. Надо документацию читать на minted...

А вообще, по-моему, тебе проще было бы поставить внешнюю команду, которая раскрашивает синтаксис вставкой неких тегов (скажем, для html), забульбенить баш-скрипт и простую команду, которая используя \write18 стала бы тебе полным аналогом этого minted'а.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Kroz

Подскажи или ткни носом в нормальный мануал

Все о TeX, Д. Кнут

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

А вообще, по-моему, тебе проще было бы поставить внешнюю команду

Сюрприз-сюрприз, minted всего лишь обертка к pygments.

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

А, если все так просто — надо лишь написать свой аналог этого minted.

Мне-то оно нафиг не нужно. Но, как обычно — за вознаграждение готов шабашку сделать.

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

Короче, после часа разбирательства получил рабочий вариант. Даже не хочу даже разбираться почему это работает. Магия, не трогать.

\documentclass[a4paper,10pt]{book}

\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[english,ukrainian]{babel}

\usepackage{minted}

%%%%%%%%%%%%%%% Сам патч
\makeatletter
    
\newcommand{\minted@write@detok}[1]{%
  \immediate\write\FV@OutFile{\detokenize{#1}}}%

\newcommand{\minted@FVB@VerbatimOut}[1]{%
  \@bsphack
  \begingroup
    \FV@UseKeyValues
    \FV@DefineWhiteSpace
    \def\FV@Space{\space}%
    \FV@DefineTabOut
    %\def\FV@ProcessLine{\immediate\write\FV@OutFile}% %Old, non-Unicode version
    \let\FV@ProcessLine\minted@write@detok %Patch for Unicode
    \immediate\openout\FV@OutFile #1\relax
    \let\FV@FontScanPrep\relax
%% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures)
    \let\@noligs\relax
%% DG/SR modification end
    \FV@Scan}
    
\let\FVB@VerbatimOut\minted@FVB@VerbatimOut

\renewcommand\minted@savecode[1]{
  \immediate\openout\minted@code\jobname.pyg
  \immediate\write\minted@code{\expandafter\detokenize\expandafter{#1}}%
  \immediate\closeout\minted@code}
%\makeatother
%%%%%%%%%%%%%%% Конец патча

\newenvironment{code}{
	\VerbatimEnvironment
	\minted@resetoptions
    \begin{VerbatimOut}{\jobname.pyg}}
{
     \end{VerbatimOut}
     \minted@pygmentize{c++}
     \DeleteFile{\jobname.pyg}
}

\begin{document}

\begin{code}
double m[4];    // Работает
m[0] = 1;
double *n = (double *) malloc(pocet_cisel * 4 * sizeof (double));
n[4 + 0] = 1;
free(n);
\end{code}

\end{document}

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.