列表包换行问题,包含 Unicode 字符

列表包换行问题,包含 Unicode 字符

当我使用listings在块中显示带有俄语注释的代码时literate,我在空格字符上获得了无效的换行符。

请参阅下面的 MWE 作为示例,它编译为本问题末尾提供的文档。

我怎样才能解决这个问题?


\documentclass[varwidth=true, border={6pt -5pt 6pt 2pt}]{standalone}
%\documentclass{extarticle}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{cmap}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage[T2A]{fontenc}
\usepackage[babel=true,tracking=true]{microtype}
%------------------------------------------------
\usepackage{PTSans}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{filecontents}
\begin{filecontents*}{dbstart.txt}
-- Cоздаем таблицу Группа
create table sgroup (
id integer not null,
group_name varchar(40),
primary key (id));  -- уникальный ключ id
-- Cоздаем таблицу Студент
create table student (
id integer not null,
id_group integer not null, -- поле для связи с таблицей Группа
student_name varchar(40),
last_name varchar(40),
middle_name varchar(40),
sex char(1),
age smallint,
primary key (id), -- уникальный ключ id
foreign key (id_group) references sgroup (id)); -- определение связи с таблицей Группа
-- Cоздаем таблицу Хобби
create table hobby (
id integer not null, -- уникальный ключ
hobby_name varchar(100),
primary key (id)); -- уникальный ключ id
-- Cоздаем таблицу Студент-Хобби
create table student_hobby (
id_student integer not null, -- поле для связи с таблицей Студент
id_hobby integer not null, -- поле для связи с таблицей Хобби
primary key (id_student, id_hobby), -- уникальный ключ составной id_student, id_hobby
foreign key (id_hobby) references hobby (id), -- определение связи с таблицей Хобби
foreign key (id_student) references student (id)); -- определение связи с таблицей Студент
\end{filecontents*}
\definecolor{gray}{rgb}{0.4,0.4,0.4}
\definecolor{darkblue}{rgb}{0.0,0.0,0.6}
\definecolor{cyan}{rgb}{0.0,0.6,0.6}
\usepackage{listings}
\lstset{
    inputencoding=utf8,
    extendedchars=false,
    keepspaces=true,
    breaklines=true,
    breakatwhitespace=true,
    breakindent=0pt,
    literate={а}{{\selectfont\char224}}1
    {б}{{\selectfont\char225}}1
    {в}{{\selectfont\char226}}1
    {г}{{\selectfont\char227}}1
    {д}{{\selectfont\char228}}1
    {е}{{\selectfont\char229}}1
    {ё}{{\"e}}1
    {ж}{{\selectfont\char230}}1
    {з}{{\selectfont\char231}}1
    {и}{{\selectfont\char232}}1
    {й}{{\selectfont\char233}}1
    {к}{{\selectfont\char234}}1
    {л}{{\selectfont\char235}}1
    {м}{{\selectfont\char236}}1
    {н}{{\selectfont\char237}}1
    {о}{{\selectfont\char238}}1
    {п}{{\selectfont\char239}}1
    {р}{{\selectfont\char240}}1
    {с}{{\selectfont\char241}}1
    {т}{{\selectfont\char242}}1
    {у}{{\selectfont\char243}}1
    {ф}{{\selectfont\char244}}1
    {х}{{\selectfont\char245}}1
    {ц}{{\selectfont\char246}}1
    {ч}{{\selectfont\char247}}1
    {ш}{{\selectfont\char248}}1
    {щ}{{\selectfont\char249}}1
    {ъ}{{\selectfont\char250}}1
    {ы}{{\selectfont\char251}}1
    {ь}{{\selectfont\char252}}1
    {э}{{\selectfont\char253}}1
    {ю}{{\selectfont\char254}}1
    {я}{{\selectfont\char255}}1
    {А}{{\selectfont\char192}}1
    {Б}{{\selectfont\char193}}1
    {В}{{\selectfont\char194}}1
    {Г}{{\selectfont\char195}}1
    {Д}{{\selectfont\char196}}1
    {Е}{{\selectfont\char197}}1
    {Ё}{{\"E}}1
    {Ж}{{\selectfont\char198}}1
    {З}{{\selectfont\char199}}1
    {И}{{\selectfont\char200}}1
    {Й}{{\selectfont\char201}}1
    {К}{{\selectfont\char202}}1
    {Л}{{\selectfont\char203}}1
    {М}{{\selectfont\char204}}1
    {Н}{{\selectfont\char205}}1
    {О}{{\selectfont\char206}}1
    {П}{{\selectfont\char207}}1
    {Р}{{\selectfont\char208}}1
    {С}{{\selectfont\char209}}1
    {Т}{{\selectfont\char210}}1
    {У}{{\selectfont\char211}}1
    {Ф}{{\selectfont\char212}}1
    {Х}{{\selectfont\char213}}1
    {Ц}{{\selectfont\char214}}1
    {Ч}{{\selectfont\char215}}1
    {Ш}{{\selectfont\char216}}1
    {Щ}{{\selectfont\char217}}1
    {Ъ}{{\selectfont\char218}}1
    {Ы}{{\selectfont\char219}}1
    {Ь}{{\selectfont\char220}}1
    {Э}{{\selectfont\char221}}1
    {Ю}{{\selectfont\char222}}1
    {Я}{{\selectfont\char223}}1
}
\lstloadlanguages{XML, SQL, C}%Загружаемые языки
\lstdefinelanguage{SQL}
{
    keywords={create, table, primary, foreign, references, key, not, null, select,
        insert, update, where, from, as, into, values, set, delete, order, by, and,
        distinct, max, min, group, having, count, left, right, full, join, on, union, plan, collate, all, returns, procedure, begin, end, suspend, generator, to, active, trigger, for, before, after, is, if, then, new, old, gen_id, position, inactive, grant, revoke, with, option, public, domain, collation, character, translation, usage, cascade, restrict, sequence, increment, minvalue, maxvalue, start},
    keywordstyle=\color{darkblue},
    ndkeywords={varchar, integer, smallint, char},
    ndkeywordstyle=\color{cyan},
    sensitive=false,
    morecomment=[l]--,
    morecomment=[s][\color{orange}]{/*}{*/},
    morestring=[d]',
    morestring=[d]",
    stringstyle=\color{purple}
}
\lstdefinestyle{listSQL}{
    language=SQL,
    belowcaptionskip=5pt,
    xleftmargin=0.5cm,
    numbers=left,
    numberstyle=\scriptsize\usefont{T2A}{PTMono-TLF}{m}{n},%шрифт нумерации
    frame=single,
    emph={},
    emphstyle=\color{red},
    basicstyle=\small\usefont{T2A}{PTMono-TLF}{m}{n},
    columns=fullflexible,
    showstringspaces=false,
    commentstyle=\color{gray}\upshape}
\begin{document}
    \lstinputlisting[label=dbstart, style=listSQL]{dbstart.txt}
\end{document}

上述代码的编译输出的屏幕截图。

答案1

listingsliterate使用时似乎无法正确重置空白状态。

顺便说一句,我认为所有\selectfont命令都是不必要的,所以我在下面的代码中删除了它们。

你可以尝试这个:

\makeatletter
\lstset{
    keepspaces=true,
    breaklines=true,
    breakatwhitespace=true,
    breakindent=0pt,
    literate={а}{\lst@whitespacefalse\char224 }1
    {б}{\lst@whitespacefalse\char225 }1
    {в}{\lst@whitespacefalse\char226 }1
    {г}{\lst@whitespacefalse\char227 }1
    {д}{\lst@whitespacefalse\char228 }1
    {е}{\lst@whitespacefalse\char229 }1
    {ё}{\"e }1
    {ж}{\lst@whitespacefalse\char230 }1
    {з}{\lst@whitespacefalse\char231 }1
    {и}{\lst@whitespacefalse\char232 }1
    {й}{\lst@whitespacefalse\char233 }1
    {к}{\lst@whitespacefalse\char234 }1
    {л}{\lst@whitespacefalse\char235 }1
    {м}{\lst@whitespacefalse\char236 }1
    {н}{\lst@whitespacefalse\char237 }1
    {о}{\lst@whitespacefalse\char238 }1
    {п}{\lst@whitespacefalse\char239 }1
    {р}{\lst@whitespacefalse\char240 }1
    {с}{\lst@whitespacefalse\char241 }1
    {т}{\lst@whitespacefalse\char242 }1
    {у}{\lst@whitespacefalse\char243 }1
    {ф}{\lst@whitespacefalse\char244 }1
    {х}{\lst@whitespacefalse\char245 }1
    {ц}{\lst@whitespacefalse\char246 }1
    {ч}{\lst@whitespacefalse\char247 }1
    {ш}{\lst@whitespacefalse\char248 }1
    {щ}{\lst@whitespacefalse\char249 }1
    {ъ}{\lst@whitespacefalse\char250 }1
    {ы}{\lst@whitespacefalse\char251 }1
    {ь}{\lst@whitespacefalse\char252 }1
    {э}{\lst@whitespacefalse\char253 }1
    {ю}{\lst@whitespacefalse\char254 }1
    {я}{\lst@whitespacefalse\char255 }1
    {А}{\lst@whitespacefalse\char192 }1
    {Б}{\lst@whitespacefalse\char193 }1
    {В}{\lst@whitespacefalse\char194 }1
    {Г}{\lst@whitespacefalse\char195 }1
    {Д}{\lst@whitespacefalse\char196 }1
    {Е}{\lst@whitespacefalse\char197 }1
    {Ё}{\"E }1
    {Ж}{\lst@whitespacefalse\char198 }1
    {З}{\lst@whitespacefalse\char199 }1
    {И}{\lst@whitespacefalse\char200 }1
    {Й}{\lst@whitespacefalse\char201 }1
    {К}{\lst@whitespacefalse\char202 }1
    {Л}{\lst@whitespacefalse\char203 }1
    {М}{\lst@whitespacefalse\char204 }1
    {Н}{\lst@whitespacefalse\char205 }1
    {О}{\lst@whitespacefalse\char206 }1
    {П}{\lst@whitespacefalse\char207 }1
    {Р}{\lst@whitespacefalse\char208 }1
    {С}{\lst@whitespacefalse\char209 }1
    {Т}{\lst@whitespacefalse\char210 }1
    {У}{\lst@whitespacefalse\char211 }1
    {Ф}{\lst@whitespacefalse\char212 }1
    {Х}{\lst@whitespacefalse\char213 }1
    {Ц}{\lst@whitespacefalse\char214 }1
    {Ч}{\lst@whitespacefalse\char215 }1
    {Ш}{\lst@whitespacefalse\char216 }1
    {Щ}{\lst@whitespacefalse\char217 }1
    {Ъ}{\lst@whitespacefalse\char218 }1
    {Ы}{\lst@whitespacefalse\char219 }1
    {Ь}{\lst@whitespacefalse\char220 }1
    {Э}{\lst@whitespacefalse\char221 }1
    {Ю}{\lst@whitespacefalse\char222 }1
    {Я}{\lst@whitespacefalse\char223 }1
}

答案2

似乎存在各种字体和编码问题。Создаем使用常规的LATIN CAPITAL LETTER (U+0043),例如,而不是 С (U+0421 CYRILLIC CAPITAL LETTER ES)\inputenc已经有几年不需要了;\usepackage{filecontents}也不再需要了。

这个例子对LuaLaTeX我来说非常符合预期,也许它也可以帮助您入门:

\documentclass{article}
 \usepackage{fontspec}
    \setsansfont{PT Sans}
\usepackage[english,russian]{babel}

\usepackage{xcolor}
    \definecolor{gray}{rgb}{0.4,0.4,0.4}
    \definecolor{darkblue}{rgb}{0.0,0.0,0.6}
    \definecolor{cyan}{rgb}{0.0,0.6,0.6}

\renewcommand{\familydefault}{\sfdefault}

\usepackage{listings}
\lstset{%
    keepspaces=true,
    breaklines=true,
    breakatwhitespace=true,
}

\lstloadlanguages{SQL}
\lstdefinelanguage{SQL}{%
    keywords={create, table, primary, foreign, references, key, not, null, 
    select, insert, update, where, from, as, into, values, set, delete, 
    order, by, and, distinct, max, min, group, having, count, left, right, 
    full, join, on, union, plan, collate, all, returns, procedure, begin, end, 
    suspend, generator, to, active, trigger, for, before, after, is, if, then, 
    new, old, gen_id, position, inactive, grant, revoke, with, option, public, 
    domain, collation, character, translation, usage, cascade, restrict, 
    sequence, increment, minvalue, maxvalue, start},
    keywordstyle=\color{darkblue},
    ndkeywords={varchar, integer, smallint, char},
    ndkeywordstyle=\color{cyan},
    sensitive=false,
    stringstyle=\color{purple}
}

\lstdefinestyle{listSQL}{%
    language=SQL,
    belowcaptionskip=5pt,
    xleftmargin=0.5cm,
    numbers=left,
    numberstyle=\scriptsize,
    frame=single,
    basicstyle=\small,
    columns=fullflexible,
    commentstyle=\color{gray}\upshape
}

\begin{filecontents*}{dbstart.txt}
-- Создаем таблицу Группа
create table sgroup (
id integer not null,
group_name varchar(40),
primary key (id));  -- уникальный ключ id
-- Создаем таблицу Студент
create table student (
id integer not null,
id_group integer not null, -- поле для связи с таблицей Группа
student_name varchar(40),
last_name varchar(40),
middle_name varchar(40),
sex char(1),
age smallint,
primary key (id), -- уникальный ключ id
foreign key (id_group) references sgroup (id)); -- определение связи с таблицей Группа
-- Создаем таблицу Хобби
create table hobby (
id integer not null, -- уникальный ключ
hobby_name varchar(100),
primary key (id)); -- уникальный ключ id
-- Создаем таблицу Студент-Хобби
create table student_hobby (
id_student integer not null, -- поле для связи с таблицей Студент
id_hobby integer not null, -- поле для связи с таблицей Хобби
primary key (id_student, id_hobby), -- уникальный ключ составной id_student, id_hobby
foreign key (id_hobby) references hobby (id), -- определение связи с таблицей Хобби
foreign key (id_student) references student (id)); -- определение связи с таблицей Студент
\end{filecontents*}

\begin{document}
    \lstinputlisting[label=dbstart, style=listSQL]{dbstart.txt}
\end{document}

在此处输入图片描述

相关内容