Списки в латексе с UTF-8 (или, по крайней мере, немецкие умлауты)
пытаясь включить исходный файл в мой документ latex с помощью пакета listings, у меня возникли проблемы с немецкими umlauts внутри комментариев в коде.
Используя
lstset{
extendedchars=true,
inputencoding=utf8x
}
Umlauts в исходных файлах (закодированных в UTF-8 без спецификации) обрабатываются, но они каким-то образом перемещаются в начало слова, в котором они содержатся.
Так что
// die Größe muss berücksichtigt werden
во входном исходном файле становится
// die ößGre muss übercksichtigt werden
в выходной файл.
Примечание: так как я нашел ошибки в моей первоначальной настройке, я сильно отредактировал этот вопрос
22 ответов:
Я нашел более простой подход, который работает для меня:
\usepackage{listings} \lstset{ literate={ö}{{\"o}}1 {ä}{{\"a}}1 {ü}{{\"u}}1 }
на комментарии только можно использовать :
\lstset{language=C++,texcl=true}чем ваши комментарии становятся Latex и вы можете использовать "специальные" символы
\begin{lstlisting} int iLink = 0x01; // Paramètre entrée \end{lstlisting}
So geht es (должен работать и для других языков-испанского, датского)
---Чик---
\documentclass[ a4paper, %% defines the paper size: a4paper (default), a5paper, letterpaper, ... 12pt %% set default font size to 12 point ]{scrartcl} %% article, see KOMA documentation (scrguide.dvi) \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{listings} \lstset{language=Pascal} \lstset{literate=% {Ö}{{\"O}}1 {Ä}{{\"A}}1 {Ü}{{\"U}}1 {ß}{{\ss}}2 {ü}{{\"u}}1 {ä}{{\"a}}1 {ö}{{\"o}}1 } \begin{document} [Latex: kann man Umlaute in lstlisting verwenden?] \begin{lstlisting} Test für Umlaut äöü ÄÖÜ ß So geht es \end{lstlisting} \end{document}
мой вклад в чешский язык.
\lstset{ inputencoding=utf8, extendedchars=true, literate=% {á}{{\'a}}1 {č}{{\v{c}}}1 {ď}{{\v{d}}}1 {é}{{\'e}}1 {ě}{{\v{e}}}1 {í}{{\'i}}1 {ň}{{\v{n}}}1 {ó}{{\'o}}1 {ř}{{\v{r}}}1 {š}{{\v{s}}}1 {ť}{{\v{t}}}1 {ú}{{\'u}}1 {ů}{{\r{u}}}1 {ý}{{\'y}}1 {ž}{{\v{z}}}1 {Á}{{\'A}}1 {Č}{{\v{C}}}1 {Ď}{{\v{D}}}1 {É}{{\'E}}1 {Ě}{{\v{E}}}1 {Í}{{\'I}}1 {Ň}{{\v{N}}}1 {Ó}{{\'O}}1 {Ř}{{\v{R}}}1 {Š}{{\v{S}}}1 {Ť}{{\v{T}}}1 {Ú}{{\'U}}1 {Ů}{{\r{U}}}1 {Ý}{{\'Y}}1 {Ž}{{\v{Z}}}1 }
ОК, нашел своего рода обходной путь сейчас:
вместо пакета листингов используйте listingsutf8
usepackage\{listingsutf8}
списки копию.sty в папку, в которой находится документ
найдите следующие строки
\lst@CCPutMacro \lst@ProcessOther {"23}\# \lst@ProcessLetter{"24}\textdollar \lst@ProcessOther {"25}\% \lst@ProcessOther {"26}\&введите там следующие строки (каждая "регистрирует" один умлаут)
\lst@ProcessLetter{"E4}{\"a} \lst@ProcessLetter{"F6}{\"o} \lst@ProcessLetter{"FC}{\"u} \lst@ProcessLetter{"C4}{\"A} \lst@ProcessLetter{"D6}{\"O} \lst@ProcessLetter{"DC}{\"U} \lst@ProcessLetter{"DF}{\ss{}}сохранить файл
использовать
\lstset{ extendedchars=\true, inputencoding=utf8/latin1 }чтобы включить отображение символов utf8 на символы latin1
- конвертировать окончания строк исходного файла из windows (\r\n) в unix (\n)
- наслаждайтесь
Я знаю, что это некрасиво во многом, но единственное решение, которое работает для меня до сих пор.
мой вклад для бразильского португальского.
\lstset{% inputencoding=utf8, extendedchars=true, literate=% {é}{{\'{e}}}1 {è}{{\`{e}}}1 {ê}{{\^{e}}}1 {ë}{{\¨{e}}}1 {É}{{\'{E}}}1 {Ê}{{\^{E}}}1 {û}{{\^{u}}}1 {ù}{{\`{u}}}1 {ú}{{\'{u}}}1 {â}{{\^{a}}}1 {à}{{\`{a}}}1 {á}{{\'{a}}}1 {ã}{{\~{a}}}1 {Á}{{\'{A}}}1 {Â}{{\^{A}}}1 {Ã}{{\~{A}}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {õ}{{\~{o}}}1 {ó}{{\'{o}}}1 {ô}{{\^{o}}}1 {Õ}{{\~{O}}}1 {Ó}{{\'{O}}}1 {Ô}{{\^{O}}}1 {î}{{\^{i}}}1 {Î}{{\^{I}}}1 {í}{{\'{i}}}1 {Í}{{\~{Í}}}1 }
более простой подход для французского языка.
\documentclass{article} \usepackage[utf8]{inputenc} \usepackage[francais]{babel} \usepackage[T1]{fontenc} \usepackage{listings} \lstloadlanguages{R} \lstset{language=R} \lstset{% inputencoding=utf8, extendedchars=true, literate=% {é}{{\'{e}}}1 {è}{{\`{e}}}1 {ê}{{\^{e}}}1 {ë}{{\¨{e}}}1 {û}{{\^{u}}}1 {ù}{{\`{u}}}1 {â}{{\^{a}}}1 {à}{{\`{a}}}1 {î}{{\^{i}}}1 {ô}{{\^{o}}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {É}{{\'{E}}}1 {Ê}{{\^{E}}}1 {À}{{\`{A}}}1 {Â}{{\^{A}}}1 {Î}{{\^{I}}}1 } \begin{document} \begin{lstlisting} # Est-ce que ça marche : é ê è à Â Ê É Î ç Ç x<-rnorm(100,0,10) plot(density(x)) \end{lstlisting} \end{document}
работает для большинства iso-символов. (в том числе шведский åäöÅÄÖ который является то, что мне нужно)
\usepackage[utf8]{inputenc} \usepackage{listings} \lstset{literate= {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1 {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1 {€}{{\EUR}}1 {£}{{\pounds}}1 }источник:http://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings#Encoding_issue
отлично работает для меня!
мои 2 цента для французской стороны:
\lst@ProcessOther {"C0}{\`{A}} \lst@ProcessOther {"C1}{\'{A}} \lst@ProcessOther {"C2}{\^{A}} \lst@ProcessOther {"C4}{\"{A}} \lst@ProcessOther {"C7}{\c{C}} \lst@ProcessOther {"C8}{\`{E}} \lst@ProcessOther {"C9}{\'{E}} \lst@ProcessOther {"CA}{\^{E}} \lst@ProcessOther {"CB}{\"{E}} \lst@ProcessOther {"CE}{\^{I}} \lst@ProcessOther {"CF}{\"{I}} \lst@ProcessOther {"D4}{\^{O}} \lst@ProcessOther {"D6}{\"{O}} \lst@ProcessOther {"D9}{\`{U}} \lst@ProcessOther {"DB}{\^{U}} \lst@ProcessOther {"E0}{\`{a}} \lst@ProcessOther {"E1}{\'{a}} \lst@ProcessOther {"E2}{\^{a}} \lst@ProcessOther {"E4}{\"{a}} \lst@ProcessOther {"E7}{\c{c}} \lst@ProcessOther {"E8}{\`{e}} \lst@ProcessOther {"E9}{\'{e}} \lst@ProcessOther {"EA}{\^{e}} \lst@ProcessOther {"EB}{\"{e}} \lst@ProcessOther {"EE}{\^{\i}} \lst@ProcessOther {"EF}{\"{\i}} \lst@ProcessOther {"F4}{\^{o}} \lst@ProcessOther {"F6}{\"{o}} \lst@ProcessOther {"F9}{\`{u}} \lst@ProcessOther {"FB}{\^{u}}
шведская версия:
\lstset{literate=% {å}{{\r{a}}}1 {ä}{{\"a}}1 {ö}{{\"o}}1 {Å}{{\r{A}}}1 {Ä}{{\"A}}1 {Ö}{{\"O}}1 }
Я могу подтвердить, что решение, предоставленное Яношем, работает почти правильно.
в любом случае, вы должны изменить списки.sty либо в вашей локальной копии, либо непосредственно в общем файле и добавьте следующее:
\lst@CCPutMacro \lst@ProcessOther {"23}\# \lst@ProcessLetter{"24}\textdollar \lst@ProcessOther {"25}\% \lst@ProcessOther {"26}\& %spanish letters coded in UTF \lst@ProcessOther {"E1}{\'a} \lst@ProcessOther {"C1}{\'A} \lst@ProcessOther {"E9}{\'e} \lst@ProcessOther {"C9}{\'E} \lst@ProcessOther {"ED}{\'i} \lst@ProcessOther {"CD}{\'I} \lst@ProcessOther {"F3}{\'o} \lst@ProcessOther {"D3}{\'O} \lst@ProcessOther {"FA}{\'u} \lst@ProcessOther {"DA}{\'U} \lst@ProcessOther {"F1}{ñ} \lst@ProcessOther {"D1}{Ñ}в моем .tex-файл я использовал следующие параметры объявления:
\usepackage{listingsutf8} \lstset{ inputencoding=utf8, extendedchars=\true}надеюсь, что это может помочь кому-нибудь, и, возможно, мы можем построить список.sty содержит почти каждый символ UTF8... :)
аналогично сообщениям ранее (yaxz и другие) я определил макросы для хорватского языка:
% on top \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[croatian]{babel} % add listings package \usepackage{listings} % set font translations \lstset{inputencoding=utf8} \lstset{extendedchars=true} \lstset{ literate=% {ć}{{\'c}}1 {č}{{\v{c}}}1 {đ}{{\dj{}}}1 {š}{{\v{s}}}1 {ž}{{\v{z}}}1 {Ć}{{\'C}}1 {Č}{{\v{C}}}1 {Đ}{{\DJ{}}}1 {Š}{{\v{S}}}1 {Ž}{{\v{Z}}}1 }у меня все еще есть "маленькая" проблема с добавлением ключевого слова "inače". Следующее не будет работать для "inače":
\lstset{morekeywords={ponavljaj, ako, inače, dok}}Ключевое слово "inače" (которое появляется в коде) не распознается как ключевое слово. Есть идеи?
надеюсь, что это поможет кому-то (кроме меня :)).
мой вклад в литовский язык:
\lstset{% literate=% {ą}{{\k{a}}}1 {č}{{\v{c}}}1 {ę}{{\k{e}}}1 {ė}{{\.{e}}}1 {į}{{\k{i}}}1 {š}{{\v{s}}}1 {ų}{{\k{u}}}1 {ū}{{\={u}}}1 {ž}{{\v{z}}}1 {Ą}{{\k{A}}}1 {Č}{{\v{C}}}1 {Ę}{{\k{E}}}1 {Ė}{{\.{E}}}1 {Į}{{\k{I}}}1 {Š}{{\v{S}}}1 {Ų}{{\k{U}}}1 {Ū}{{\={U}}}1 {Ž}{{\v{Z}}}1 }
автор пакета предполагает С помощью опции texcl. Иногда это помогает, иногда нет.
самое чистое решение для этого-использовать пакет listings2:http://www.atscire.de/index.php?nav=products/listings2
просто использовать
\usepackage{listings2}вместо\usepackage{listings}и это все.
норвежские буквы для списки.стай в решении @Janosch:
\lst@ProcessLetter{"C5}{\AA} \lst@ProcessLetter{"C6}{\AE} \lst@ProcessLetter{"D8}{\O} \lst@ProcessLetter{"E5}{\aa} \lst@ProcessLetter{"E6}{\ae} \lst@ProcessLetter{"F8}{\o}
Для Вьетнамцев:
\usepackage{vntex} \usepackage[utf8]{inputenc} \usepackage{listings} \usepackage{tipa} \lstset{columns=fullflexible,literate= {đ}{{\dj}}1 {â}{{\^a}}1 {ă}{{\u{a}}}1 {ê}{{\^e}}1 {ô}{{\^o}}1 {ơ}{{\ohorn}}1 {ư}{{\uhorn}}1 {á}{{\'a}}1 {à}{{\`a}}1 {ả}{\h{a}}1 {ã}{{\~a}}1 {ạ}{\textsubdot{a}}1 {ấ}{\'{\^a}}1 {ầ}{\`{\^a}}1 {ẩ}{\h{\^a}}1 {ẫ}{\~{\^a}}1 {ậ}{\textsubdot{\^a}}1 {ắ}{\'{\u{a}}}1 {ằ}{\`{\u{a}}}1 {ẳ}{\h{\u{a}}}1 {ẵ}{\~{\u{a}}}1 {ặ}{\textsubdot{\u{a}}}1 {é}{{\'e}}1 {è}{{\`e}}1 {ẻ}{\h{e}}1 {ẽ}{{\~e}}1 {ẹ}{\textsubdot{e}}1 {ế}{\'{\^e}}1 {ề}{\`{\^e}}1 {ể}{\h{\^e}}1 {ễ}{\~{\^e}}1 {ệ}{\textsubdot{\^{e}}}1 {í}{{\'i}}1 {ì}{{\`i}}1 {ỉ}{\h{i}}1 {ĩ}{{\~i}}1 {ị}{\textsubdot{i}}1 {ó}{{\'o}}1 {ò}{{\`o}}1 {ỏ}{\h{o}}1 {õ}{{\~o}}1 {ọ}{\textsubdot{o}}1 {ố}{\'{\^o}}1 {ồ}{\`{\^o}}1 {ổ}{\h{\^o}}1 {ỗ}{\~{\^o}}1 {ộ}{\textsubdot{\^o}}1 {ớ}{\'{\ohorn}}1 {ờ}{\`{\ohorn}}1 {ở}{\h{\ohorn}}1 {ỡ}{\~{\ohorn}}1 {ợ}{\textsubdot{\ohorn}}1 {ú}{{\'u}}1 {ù}{{\`u}}1 {ủ}{\h{u}}1 {ũ}{{\~u}}1 {ụ}{\textsubdot{u}}1 {ứ}{\'{\uhorn}}1 {ừ}{\`{\uhorn}}1 {ử}{\h{\uhorn}}1 {ữ}{\~{\uhorn}}1 {ự}{\textsubdot{\uhorn}}1 {ý}{{\'y}}1 {ỳ}{{\`y}}1 {ỷ}{\h{y}}1 {ỹ}{{\~y}}1 {ỵ}{\textsubdot{y}}1 {Đ}{{\DJ}}1 {Â}{{\^A}}1 {Ă}{{\u{A}}}1 {Ê}{{\^E}}1 {Ô}{{\^O}}1 {Ơ}{{\OHORN}}1 {Ư}{{\UHORN}}1 {Á}{{\'A}}1 {À}{{\`A}}1 {Ả}{\h{A}}1 {Ã}{{\~A}}1 {Ạ}{\textsubdot{A}}1 {Ấ}{\'{\^A}}1 {Ầ}{\`{\^A}}1 {Ẩ}{\h{\^A}}1 {Ẫ}{\~{\^A}}1 {Ậ}{\textsubdot{\^A}}1 {Ắ}{\'{\u{A}}}1 {Ằ}{\`{\u{A}}}1 {Ẳ}{\h{\u{A}}}1 {Ẵ}{\~{\u{A}}}1 {Ặ}{\textsubdot{\u{A}}}1 {É}{{\'E}}1 {È}{{\`E}}1 {Ẻ}{\h{E}}1 {Ẽ}{{\~E}}1 {Ẹ}{\textsubdot{E}}1 {Ế}{\'{\^E}}1 {Ề}{\`{\^E}}1 {Ể}{\h{\^E}}1 {Ễ}{\~{\^E}}1 {Ệ}{\textsubdot{\^{E}}}1 {Í}{{\'I}}1 {Ì}{{\`I}}1 {Ỉ}{\h{I}}1 {Ĩ}{{\~I}}1 {Ị}{\textsubdot{I}}1 {Ó}{{\'O}}1 {Ò}{{\`O}}1 {Ỏ}{\h{O}}1 {Õ}{{\~O}}1 {Ọ}{\textsubdot{O}}1 {Ố}{\'{\^O}}1 {Ồ}{\`{\^O}}1 {Ổ}{\h{\^O}}1 {Ỗ}{\~{\^O}}1 {Ộ}{\textsubdot{\^O}}1 {Ớ}{\'{\OHORN}}1 {Ờ}{\`{\OHORN}}1 {Ở}{\h{\OHORN}}1 {Ỡ}{\~{\OHORN}}1 {Ợ}{\textsubdot{\OHORN}}1 {Ú}{{\'U}}1 {Ù}{{\`U}}1 {Ủ}{\h{U}}1 {Ũ}{{\~U}}1 {Ụ}{\textsubdot{U}}1 {Ứ}{\'{\UHORN}}1 {Ừ}{\`{\UHORN}}1 {Ử}{\h{\UHORN}}1 {Ữ}{\~{\UHORN}}1 {Ự}{\textsubdot{\UHORN}}1 {Ý}{{\'Y}}1 {Ỳ}{{\`Y}}1 {Ỷ}{\h{Y}}1 {Ỹ}{{\~Y}}1 {Ỵ}{\textsubdot{Y}}1 }
мы все знаем, как LaTeX не играет хорошо с греческим языком. Тем не менее, вот мой вклад, который требует нескольких обходных путей и не включает диакритики (но работает!):
\usepackage[greek]{babel} \usepackage{textgreek} \usepackage{listings} % Notice that here it is spelled ‘omikron’, not ‘omicron’, % and that I use ‘\textmugreek’ instead of ‘\textmu’, % which are both part of the textgreek package, but the % ‘normal’ \textmu conflicts with the textcomp package as % that uses another font for \textmu. \DeclareUnicodeCharacter{03BF}{\textomikron} \DeclareUnicodeCharacter{039F}{\textOmikron} \DeclareUnicodeCharacter{03BC}{\textmugreek} \lstset{ inputencoding=utf8, extendedchars=true, literate= {α}{{\textalpha}}1 {Α}{{\textAlpha}}1 {β}{{\textbeta}}1 {Β}{{\textBeta}}1 {γ}{{\textgamma}}1 {Γ}{{\textGamma}}1 {δ}{{\textdelta}}1 {Δ}{{\textDelta}}1 {ε}{{\textepsilon}}1 {Ε}{{\textEpsilon}}1 {ζ}{{\textzeta}}1 {Ζ}{{\textZeta}}1 {η}{{\texteta}}1 {Η}{{\textEta}}1 {θ}{{\texttheta}}1 {Θ}{{\textTheta}}1 {ι}{{\textiota}}1 {Ι}{{\textIota}}1 {κ}{{\textkappa}}1 {Κ}{{\textKappa}}1 {λ}{{\textlambda}}1 {Λ}{{\textLambda}}1 {μ}{{\textmugreek}}1 {Μ}{{\textMu}}1 {ν}{{\textnu}}1 {Ν}{{\textNu}}1 {ξ}{{\textxi}}1 {Ξ}{{\textXi}}1 {ο}{{\textomikron}}1 {Ο}{{\textOmikron}}1 {π}{{\textpi}}1 {Π}{{\textPi}}1 {ρ}{{\textrho}}1 {Ρ}{{\textRho}}1 {σ}{{\textsigma}}1 {Σ}{{\textSigma}}1 {ς}{{\textvarsigma}}1 {τ}{{\texttau}}1 {Τ}{{\textTau}}1 {υ}{{\textupsilon}}1 {Υ}{{\textUpsilon}}1 {φ}{{\textphi}}1 {Φ}{{\textPhi}}1 {χ}{{\textchi}}1 {Χ}{{\textChi}}1 {ψ}{{\textpsi}}1 {Ψ}{{\textPsi}}1 {ω}{{\textomega}}1 {Ω}{{\textOmega}}1 }
Для Исландского Языка:
\lstset{ literate=% {Á}{{\'A}}1 {á}{{\'a}}1 {Ð}{{\dh}}1 {ð}{{\dh}}1 {É}{{\'E}}1 {é}{{\'e}}1 {í}{{\'i}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {ó}{{\'o}}1 {Ú}{{\'U}}1 {ú}{{\'u}}1 {Ý}{{\'Y}}1 {ý}{{\'y}}1 {Þ}{{\TH}}1 {þ}{{\th}}1 {Æ}{{\AE}}1 {æ}{{\ae}}1 {Ö}{{\"O}}1 {ö}{{\"o}}1 }
просто не используйте UTF-8 в LaTex, если вы хотите использовать любой списки пакеты. Использование latin1 в ваших документах будет отображать немецкие умлауты просто отлично.
Я пишу свою диссертацию на немецком языке, используя эту настройку:
% Your language, here German \usepackage[ngerman]{babel} % Will work with Umlauts \usepackage[latin1]{inputenc} % Euro characters etc. \usepackage{textcomp} % Works perfectly with latin1 \usepackage{listings}
Для Польского Языка:
\lstset{% literate=% {ą}{{\k{a}}}1 {ę}{{\k{e}}}1 {Ą}{{\k{A}}}1 {Ę}{{\k{E}}}1 {ś}{{\'{s}}}1 {Ś}{{\'{S}}}1 {ź}{{\'{z}}}1 {Ź}{{\'{Z}}}1 {ń}{{\'{n}}}1 {Ń}{{\'{N}}}1 {ć}{{\'{c}}}1 {Ć}{{\'{C}}}1 {ó}{{\'{o}}}1 {Ó}{{\'{O}}}1 {ż}{{\.{z}}}1 {Ż}{{\.{Z}}}1 {ł}{{\l{}}}1 {Ł}{{\l{}}}1 }и вот список символов, так что вы можете создать его для вашего языка:https://en.wikibooks.org/wiki/LaTeX/Special_Characters
возможно, Вам потребуется установить кодировку ввода документа также UTF-8. Там есть комп.текст.нить Текс обсуждаем как это сделать. Следующее выполняет это в TeXLive на GNU / Linux:
\usepackage[utf8]{inputenc}
Comments