8-900-374-94-44
[email protected]
Slide Image
Меню

Codeblocks русский язык в консоли: Руссификация Code::Blocks (русский язык )

В помощь начинающим программистам на C++/wxWidgets: Quick Start.

?

Previous Entry | Next Entry

Статья на тему различных методов установки wxWidgets на разных платформах откладывается на неопределённое время. Вместо неё решил пока написать коротенькую заметку о том, как быстро подготовить компьютер с ОС Windows для программирования с использованием wx (на альтернативных операционках всё проще, например во FreeBSD достаточно дать команду cd /usr/ports/devel/codeblocks/ && make install clean и подождать, пока соберётся CodeBlocks, wxWidgets, GTK+, X11 и так далее =)).

Итак, приступим. Предполагается, что у нас есть компьютер с Windows на котором ранее программированием не занимались, то есть тут не установлено никаких компиляторов, дебаггеров, библиотек и тд. Задача: на скорую руку собрать окружение что бы посмотреть, что такое wxWidgets и попробовать писать с его помощью программы.
1) Идём на http://wxpack.sourceforge.net/ и качаем свежую версию wxPack. wxPack — это набор заранее собранных библиотек в комплекте с заголовочными файлами (а так же исходниками, примерами, документацией и прочим добром) и простеньким RAD`ом. Помимо, собственно, wxWidgets в комплект входит несколько сторонних компонент, например, контрол для построения графиков. Обновляется wxPack не очень часто, так что ожидать, что там последнии версии софта не следует =).
Внимание! Полная установка wxPack может занять более 3Гб места на винте.
В нашем случае, из предложенного списка надо выбрать только библиотеки для gcc (MSVS у нас всё равно нет =) ).
2) Идём на http://www.codeblocks.org/downloads/ и качаем инсталлятор CodeBlocks для Windows (тот что mingw, иначе gcc и gdb надо ставить отдельно). Code::Blocks — это довольно продвинутая IDE, написанная на wxWidgets, которая, кстати, имеет встроенный RAD для работы с wx. Конфигурацию выбираем по своему усмотрению (советую ставить все плагины — и коре, и контриб; лишние можно будет отключить потом).

При первом запуске IDE уведомит нас, что она нашла GCC — значит всё в порядке.
3) Создаём новый проект, выбираем шаблон wxWidgets project и отвечаем на вопросы визарда. Когда спросят Prefered GUI Builder и Application Type, выбираем None и Frame Based (учиться лучше без RAD`ов ;)), а когда спросят wxWidgets` location надо оставить $(#wx) — это переменная IDE, указывающая на место нахождения wx. Можно, конечно, и прямой путь там указать, но тогда в случае чего править будет не удобно. Сразу после этого нас попросят определить эту переменную — в поле base надо указать путь, куда ставился wxPack.
На вкладке с конфигурацией галочки можно ставить на свой вкус — wxPack навалил всевозможные варианты сборки библиотеки. Внизу поставим галочку Create Empty Project а в Advanced Options можно выбрать Console Mode Application — тогда вместе с прогой будет открываться консоль, куда можно писать сообщения с помощью printf. Там же можно поставить галку для использования debug-версии библиотеки (иногда выдаёт в рантайме предупреждения о потенциальных ошибках, о чём в release даже и не узнаешь).
На последней вкладке предлагают выбрать дополнительные библиотеки, с которыми надо линковать. Для начала можно не трогать.
4) Создаём новый файл, тип C/C++ Source, задаём имя, путь и добавляем во все таргеты.
5) Идём по ссылке http://gremlinable.livejournal.com/3495.html, копируем из самого конца статьи исходник и вставляем его в созданный файл.
6) Проверяем, что всё собирается — F9. (Примечание: если пару раз нажать на выход в окне, которое находится на переднем плане прога вывалится в корку. Не пугайтесь — так и должно быть, это побочный эффект эксперимента с динамическим связыванием =))
7) Пишем свои проги, экспериментируем =)

October 2018
SMTWTFS
 123456
78910111213
14151617181920
21222324252627
28293031   

  • Browser speedtest
  • al_zatv : (no subject) [+1]
  • (Anonymous) : v [+0]
  • (Anonymous) : lamer [+0]
  • (Anonymous) : lamer [+1]
  • (Anonymous) : Lamer [+1]
  • (Anonymous)
    : lamer [+2]
  • (Anonymous) : lamer [+4]
  • (Anonymous) : Хороший сайт! Все красиво сделано. [+1]
  • (Anonymous) : wxGrid [+3]

Powered by LiveJournal.com

Командная строка Windows: Буфер вывода текста Unicode и UTF-8

Rich Turner

15 ноября 2018 г. 1 0

В этом посте мы обсудим улучшения, которые мы вносим во внутренний текстовый буфер консоли Windows, позволяя ему лучше хранить и обрабатывать текст Unicode и UTF-8.

Сообщения в серии статей о командной строке Windows:

Этот список будет обновляться по мере публикации новых сообщений:

  1. Справочная информация о командной строке
  2. Эволюция командной строки Windows
  3. Внутри консоли Windows
  4. Представляем API псевдоконсоли Windows (ConPTY)
  5. Буфер вывода текста Unicode и UTF-8 [это сообщение]

[Источник: Дэвид Фаррелл, «Создание кодировщика UTF-8 в Perl»]

Наиболее заметным аспектом терминала командной строки является то, что он отображает текст, выдаваемый вашей оболочкой и/или инструментами командной строки. и приложения в сетке моноширинных ячеек — по одной ячейке на символ/символ/глиф. Отлично, это просто. Как это может быть сложно, ведь это всего лишь буквы? Неееет! Читай дальше!

Текст есть текст есть текст. Или это?

Если вы говорите на языке, возникшем в Западной Европе (например, на английском, французском, немецком, испанском и т. д.), скорее всего, ваш письменный алфавит довольно однороден — 10 цифр, 26 отдельных букв — заглавные и строчные. case = всего 62 символа. Теперь добавьте около 30 символов пунктуации, всего вам понадобится около 95 символов. Но если вы из Восточной Азии (например, китайцы, японцы, корейцы, вьетнамцы и т. д.), вы, скорее всего, будете читать и писать текст с еще несколькими символами… всего более 7000!

Учитывая эту сложность, как компьютеры представляют, определяют, хранят, обмениваются/передают и отображают эти различные формы текста эффективным и стандартизированным/обычно понятным способом?

В начале был ASCII

На заре современных цифровых вычислений централизация была сосредоточена вокруг Великобритании и США, поэтому английский язык был преобладающим языком и используемым алфавитом.

Как мы видели выше, ~95 символов английского алфавита (и необходимая пунктуация) могут быть индивидуально представлены с использованием 7-битных значений (0-127), с оставленным местом для дополнительных невидимых управляющих кодов.

В 1963 году Американский национальный институт стандартов (ANSI) опубликовал стандарт X3.4-1963 для Американского стандартного кода для обмена информацией (ASCII), который стал основой того, что мы сейчас знаем как стандарт ASCII.

… и у Microsoft плохая репутация из-за названий вещей 😉 Первоначальный стандарт X3.4-1963 оставил 28 значений неопределенными и зарезервированными для использования в будущем. Воспользовавшись случаем, Международный консультативный комитет по телеграфу и телефону (CCITT, от французского: Comité Consultatif International Téléphonique et Télégraphique) предложил изменить раскладку ANSI, из-за которой символы нижнего регистра отличались по битовому шаблону от символов верхнего регистра на всего один бит. Это упрощенное определение/сопоставление регистра символов и конструкция клавиатур и принтеров.

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

]4 7-битная таблица ASCII

 

Однако быстрое распространение компьютеров в Европе поставило новую задачу: как представить текст на языках, отличных от английского. Например, как должны быть представлены буквы с диакритическими знаками, умлауты и дополнительные символы?

Для этого таблица ASCII была расширена за счет добавления дополнительного бита, что сделало символы 8-битными, добавив 127 «расширенных символов»:

]5 Расширенные 8-битные символы ASCII

 

по-прежнему не предоставлял достаточно места для представления всех символов, глифов и символов, необходимых пользователям компьютеров по всему миру, многим из которых необходимо было представлять и отображать дополнительные символы / глифы.

Итак, кодовые страницы были введены.

Кодовые страницы — частичное решение

Кодовые страницы определяют наборы символов для «расширенных символов» от 0x80 до 0xff (и, в некоторых случаях, несколько не отображаемых символов между 0x00 и 0x19). Выбрав другую кодовую страницу, Терминал может отображать дополнительные глифы для европейских языков и некоторые блочные символы (см. выше), текст CJK, вьетнамский текст и т. д.

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

Еще хуже то, что 128 дополнительных глифов даже близко не обеспечивают достаточное количество символов для представления некоторых языков: например, в китайском языке средней школы используется 2200 идеограмм, еще несколько сотен используются в повседневной жизни, и более 7000 идеограмм в общий.

Очевидно, что кодовые страницы — дополнительные наборы из 128 символов — не являются масштабируемым решением этой проблемы. 16 — 1 == 65 535 символов. Однако, несмотря на попытки стандартизировать японскую кодировку Shift JIS и кодировку EUC-JP, совместимую с ASCII переменной длины, кодировки кодовых страниц DBCS часто были пронизаны проблемами и не давали универсального решения проблемы кодирования текста.

Что нам действительно было нужно, так это универсальный код для текстовых данных.

Enter, Unicode

Unicode — это набор стандартов, определяющих способ представления и кодирования текста.

Разработка Unicode началась в 1987 году инженерами Xerox и Apple. Первоначальная спецификация Unicode-88 была опубликована в феврале 1988 года и с тех пор постоянно совершенствовалась и обновлялась, добавляя новые представления символов, дополнительную языковую поддержку и даже эмодзи 😊

.

Чтобы узнать больше об истории Unicode, прочтите это! Сегодня Unicode поддерживает до 1 112 064 допустимых «кодовых точек», каждая из которых представляет один символ / символ / глиф / идеограмму / и т. д. Это должно обеспечить множество адресуемых кодовых точек в будущем, особенно с учетом того, что «Юникод 11 в настоящее время определяет 137 439 кодовых точек».символов, охватывающих 146 современных и исторических шрифтов, а также несколько наборов символов и эмодзи» [источник: Википедия, октябрь 2018 г.]

«1,2 миллиона кодовых точек должно быть достаточно для всех» — источник: Rich Turner, октябрь 2018 г. Текстовые данные Unicode могут быть закодированы разными способами, каждый из которых имеет свои сильные и слабые стороны:

Кодировка Примечания # Байтов на кодовую точку Плюсы Минусы
UTF-32 Каждое допустимое 32-битное значение является прямым индексом для отдельной кодовой точки Unicode. 4 Не требуется декодирование Потребляет много места
UTF-16 Кодирование переменной длины, требующее одного или двух 16-битных значений для представления каждой кодовой точки. 2/4 Простое декодирование Занимает 2 байта даже для текста ASCII. Может быстро закончиться необходимостью 4 байта
УКС-2 Предшественник UTF-16. 16-битная кодировка фиксированной длины, используемая внутри Windows, Java и JavaScript. 2 Простое декодирование Занимает 2 байта даже для текста ASCII. Невозможно представить некоторые кодовые точки
UTF-8 Кодирование переменной длины. Требуется от одного до четырех байтов для представления всех кодовых точек Unicode. 1-4 Требования к эффективному, детализированному хранилищу Умеренная стоимость декодирования
Другие Существуют и другие кодировки, но они не получили широкого распространения. Н/Д Н/Д Н/Д

Во многом благодаря своей гибкости и эффективности хранения/передачи UTF-8 стал преобладающим механизмом кодирования текста в Интернете: на сегодняшний день (октябрь 2018 г. ) 92,4% всех веб-страниц закодированы в UTF-8!

]16 Популярность кодировки UTF-8 для веб-страниц (источник: Википедия)

 

Следовательно, все, что обрабатывает текст,0025 не менее иметь возможность поддерживать текст UTF-8.

Чтобы узнать больше о кодировании текста и Unicode, прочитайте замечательную статью Джоэла Спольски здесь: Абсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Unicode и наборах символов (без оправданий!)

Увы, консоль Windows (в настоящее время) не может поддерживать текст UTF-8!

Консоль Windows была создана еще на заре Windows, еще до того, как появился сам Unicode! Тогда было принято решение представлять каждый текстовый символ как 16-битное значение фиксированной длины (UCS-2). Таким образом, текстовый буфер консоли содержит 2 байта wchar_t значений на ячейку сетки, размер x столбцов на y строк.

Несмотря на то, что этот дизайн поддерживает консоль более 25 лет, быстрое внедрение UTF-8 начало вызывать проблемы:

кодировке, он не может представлять все кодовые точки Unicode.

Еще одна связанная, но отдельная проблема с консолью Windows заключается в том, что, поскольку GDI используется для рендеринга текста консоли, а GDI не поддерживает возврат шрифта, консоль не может отображать глифы для кодовых точек, которые не существуют в выбранном в данный момент шрифте!

Font-fallback — это возможность динамического поиска и загрузки шрифта, похожего на текущий выбранный шрифт, но содержащего глиф, отсутствующий в текущем выбранном шрифте. Эти объединенные проблемы являются причиной того, что консоль Windows не может (в настоящее время) отображать многие сложные китайские идеограммы и не может отображать смайлики.

Смайлик? СРОЧНО? На первый взгляд это может показаться тривиальным, но это проблема, поскольку некоторые инструменты теперь генерируют эмодзи, например, для обозначения результатов теста, а исходный код некоторых языков программирования поддерживает/требует Unicode, включая эмодзи!

[Источник: вы можете использовать символы эмодзи в именах переменных, констант, функций и классов Swift]

Но я отвлекся…

Атрибуты текста

цвет переднего плана и фона, а также любую другую необходимую информацию о каждой ячейке.

Эти атрибуты должны храниться эффективно и быстро — нет необходимости хранить фоновую и основную информацию для каждой ячейки отдельно, тем более что большинство консольных приложений/инструментов выводят довольно однородно окрашенный текст, но сохранение и извлечение атрибутов не должно излишне снижать производительность рендеринга.

Давайте покопаемся и выясним, как со всем этим справляется Консоль! 😊

Как обсуждалось в предыдущем посте этой серии, команда консоли была занята капитальным ремонтом внутренних компонентов консоли Windows для последних нескольких выпусков Win10, тщательно модернизируя, объединяя в модули, упрощая и улучшая код и функции консоли… при этом не жертвуя заметно производительность, а не изменение текущего поведения.

Для каждого серьезного изменения мы оцениваем и прототипируем несколько подходов, а также измеряем производительность консоли, объем используемой памяти, энергопотребление и т. д., чтобы найти лучшее реальное решение. Мы использовали тот же подход для работы по улучшению буфера, которая была начата до выпуска 1803 и продолжается после 1809..

Основная проблема, которую необходимо решить, заключалась в том, что консоль ранее сохраняла текстовые данные каждой ячейки в виде 2-байтовых значений фиксированной длины UCS-2 wchar_t .

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

Мы рассмотрели несколько подходов, создали прототипы и измерили некоторые из них, что помогло нам исключить некоторые потенциальные подходы, которые оказались неэффективными в реальных условиях.

Добавление поддержки Unicode

В итоге мы пришли к следующей архитектуре:

]21 Архитектура текстового буфера консоли

 

Сверху (синие прямоугольники исходного буфера):

  • 9002 3 ScreenInfo — хранит информацию об области просмотра и т. д., и содержит TextBuffer
    • TextBuffer — представляет текстовую область консоли в виде набора строк
      • Строка — уникальное представление каждой строки CharRow в консоли и атрибутов форматирования, применяемых к каждой строке.
        • CharRow — содержит набор ячеек CharRowCell, а также логику и состояние для обработки переноса строк и навигации.
          • CharRowCell — содержит фактический текст ячейки и байт DbcsAttribute, содержащий специфические для ячейки флаги

Несколько ключевых изменений были внесены в реализацию буфера консоли (обозначены оранжевым на схеме выше), в том числе:

  1. Консоль CharRowCell::DbcsAttribute хранит информацию о форматировании о том, насколько широкими являются текстовые данные для символов DBCS. Не все биты использовались, поэтому был добавлен дополнительный флаг , чтобы указать, превышает ли длина текстовых данных для ячейки один 16-битный wchar_t . Если этот флаг установлен, консоль будет извлекать текстовые данные из UnicodeStorage .
  2. Добавлен UnicodeStorage , который содержит карту координат {строка:столбец} для набора 16-битных wchar значений. Это позволяет буферу хранить произвольное количество значений wchar для каждой отдельной ячейки в консоли, которая должна хранить дополнительные текстовые данные Unicode, гарантируя, что консоль останется невосприимчивой к расширению до области и диапазона текстовых данных Unicode в будущем. . А поскольку UnicodeStorage — это карта, затраты на поиск текста переполнения постоянны и быстры!

Итак, представьте, если ячейке нужно отобразить смайлик улыбающегося лица Unicode: 😀 Представление этого смайлика в байтах (с прямым порядком байтов): 0xF0 0x9F 0x98 0x80 , или прописью: 0x9FF0 0x8098 . Ясно, что этот глиф эмодзи не помещается в один 2-байтовый wchar_t . Таким образом, в новом буфере будет установлен флаг «переполнения» DbcsAttribute CharRowCell, указывающий, что консоль должна искать данные в кодировке UTF-16 для этого {row:col} , хранящегося в контейнере карты UnicodeStorage.

Ключевой момент, который следует отметить в отношении этого подхода, заключается в том, что нам не нужно дополнительное хранилище, если символ может быть представлен как одно 8/16-битное значение: нам нужно хранить дополнительный «переполненный» текст только тогда, когда это необходимо. Это гарантирует, что в наиболее распространенном случае — при хранении символов ASCII и более простых символов Unicode — мы не увеличиваем объем потребляемых данных и не снижаем производительность.

Если вы используете Windows 10 October 2018 Update (сборка 1809), вы уже используете этот новый буфер!

Мы протестировали новый буфер, прежде чем незаметно включить его в сборки Insider за несколько месяцев до выпуска 1809, и внесли некоторые ключевые улучшения до выпуска 1809.

Не совсем так!

Мы также работаем над дальнейшим улучшением реализации буфера в последующих обновлениях ОС (и с помощью инсайдерских сборок, предшествующих каждому выпуску ОС).

Указанные выше изменения позволяют хранить только одну кодовую точку на CharRowCell . Более сложные глифы, для которых требуется несколько кодовых точек, пока не поддерживаются, но мы работаем над добавлением этой возможности в будущем выпуске ОС.

Текущие изменения также не охватывают то, что требуется для нашего «режим обработанного ввода», который представляет редактируемую строку ввода для таких приложений, как CMD.exe. Мы планируем и активно обновляем код для всплывающих окон, псевдонимов команд, истории команд и самой редактируемой строки ввода, чтобы также поддерживать полную поддержку Unicode.

И пока не пытайтесь отображать эмодзи — для этого требуется новый движок рендеринга, который поддерживает возврат шрифта — возможность динамически находить, загружать и отображать глифы из шрифтов, отличных от текущего выбранного шрифта. И это тема целого поста в другой раз 😉.

Оставайтесь с нами, скоро появятся новые сообщения!

Мы с нетерпением ждем ваших мыслей — не стесняйтесь выключать звук ниже или пинговать Рича в Твиттере.

Список кодов — оборотная сторона, онлайн-редактор LaTeX

Содержание

  • 1 Введение
  • 2 Вербатимная среда
  • 3 Использование списков для выделения кода
  • 4 Импорт кода из файла
  • 5 стилей и цветов кода
  • 6 Заголовки и список списков
  • 7 Образец проекта на обороте
  • 8 Справочное руководство
    • 8.1 Поддерживаемые языки
    • 8.2 Параметры для настройки стилей списка кодов
  • 9 Дополнительная литература

Введение

LaTeX широко используется в науке, и программирование стало важным аспектом в нескольких областях науки, отсюда и потребность в инструменте, правильно отображающем код. В этой статье объясняется, как использовать стандартную среду verbatim , а также листинги пакета , которые предоставляют более продвинутые функции форматирования кода. В этой отдельной статье обсуждается пакет minted , который выполняет подсветку синтаксиса с помощью Python 9.0213 pygmentize библиотека .

Среда verbatim

Инструментом по умолчанию для отображения кода в LaTeX является verbatim , который генерирует вывод моноширинным шрифтом.

 \begin{verbatim}
Текст заключен внутри окружения \texttt{verbatim}
печатается напрямую
и все команды \LaTeX{} игнорируются.
\end{дословно}
 

 Открыть этот пример на обратной стороне


Приведенный выше код выдает следующий результат:

Как и в примере во введении, весь текст печатается с разрывами строк и пробелами. Существует версия этой команды со звездочкой, вывод которой немного отличается.

 \начать{дословно*}
Текст заключен внутри окружения \texttt{verbatim}
печатается напрямую
и все команды \LaTeX{} игнорируются.
\end{дословно*}
 

 Открыть этот пример на обратной стороне


Приведенный выше код выдает следующий результат:

В этом случае пробелы выделяются специальным символом «видимый пробел»: .

Текст, подобный Verbatim, также может быть использован в абзаце с помощью \verb 9Команда 0214.

 В каталоге \verb|C:\Windows\system32| можно найти много окон
системные приложения.
 
Команда \verb+\ldots+ создает \ldots
 

 Открыть этот пример на обратной стороне


Приведенный выше код выдает следующий результат:

Команда \verb|C:\Windows\system32| печатает текст внутри разделителей | в дословном формате. В качестве разделителя можно использовать любой символ, кроме букв и * . Например \verb+\ldots+ использует + в качестве разделителя.

Использование списков для выделения кода

Чтобы использовать среду lstlisting , вы должны добавить следующую строку в преамбулу вашего документа:

 \usepackage{списки}
 

Вот пример использования среды lstlisting из пакета listings :

 \begin{lstlisting}
импортировать numpy как np
    
def incmatrix(genl1,genl2):
    м = len(genl1)
    n = длина (genl2)
    M = None # чтобы стать матрицей инцидентности
    VT = np. zeros((n*m,1), int) #фиктивная переменная
    
    # вычислить побитовую матрицу xor
    M1 = битовая матрица (genl1)
    M2 = np.triu (bitxormatrix (genl2), 1)
    для я в диапазоне (м-1):
        для j в диапазоне (i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            для k в диапазоне (len (r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;
                
                если M равно None:
                    M = np.copy(VT)
                еще:
                    M = np.concatenate ((M, VT), 1)
                
                VT = np.zeros ((n * m, 1), целое число)
    
    вернуть М
\end{список}
 

 Откройте пример объявлений на обратной стороне


Приведенный выше код выдает следующий результат:

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

 \begin{lstlisting}[язык=Python]
импортировать numpy как np
    
def incmatrix(genl1,genl2):
    м = len(genl1)
    n = длина (genl2)
    M = None # чтобы стать матрицей инцидентности
    VT = np.zeros((n*m,1), int) #фиктивная переменная
    
    # вычислить побитовую матрицу xor
    M1 = битовая матрица (genl1)
    M2 = np.triu (bitxormatrix (genl2), 1)
    для я в диапазоне (м-1):
        для j в диапазоне (i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            для k в диапазоне (len (r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;
                
                если M равно None:
                    M = np.copy(VT)
                еще:
                    M = np.concatenate ((M, VT), 1)
                
                VT = np.zeros ((n * m, 1), целое число)
    
    вернуть М
\end{список}
 

 Откройте пример объявлений на обратной стороне


Приведенный выше код выдает следующий результат:

Дополнительный параметр в скобках [language=Python] включает подсветку кода для данного конкретного языка программирования (Python), специальные слова выделены жирным шрифтом, а комментарии выделены курсивом. Полный список поддерживаемых языков программирования см. в справочном руководстве.

Импорт кода из файла

Код обычно хранится в исходном файле, поэтому команда, которая автоматически извлекает код из файла, становится очень удобной.

 Следующий код будет напрямую импортирован из файла
\lstinputlisting[language=Octave]{BitXorMatrix.m}
 



Команда \lstinputlisting[language=Octave]{BitXorMatrix.m} импортирует код из файла BitXorMatrix.m , дополнительный параметр в скобках включает подсветку языка для языка программирования Octave. Если вам нужно импортировать только часть файла, вы можете указать два параметра через запятую внутри скобок. Например, чтобы импортировать код из строки 2 в строку 12, предыдущая команда становится

 \lstinputlisting[language=Octave, firstline=2, lastline=12]{BitXorMatrix.m}
 

Если первая строка или последняя строка опущены, предполагается, что значения находятся в начале или в конце файла соответственно.

Стили и цвета кода

Форматирование кода с помощью пакета listing имеет широкие возможности настройки. Давайте посмотрим на пример

 \documentclass{статья}
\usepackage{списки}
\usepackage{xcolor}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0,5,0,5,0,5}
\definecolor{codepurple}{rgb}{0,58,0,0,82}
\definecolor{backcolor}{rgb}{0,95,0,95,0,92}
\lstdefinestyle{мой стиль}{
    backgroundcolor=\color{backcolor},
    комментарий стиль = \ цвет {codegreen},
    ключевой стиль=\цвет{пурпурный},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    базовый стиль=\ttfamily\размер сноски,
    breakatwhitespace=ложь,
    линии разрыва = истина,
    заголовокпоз=б,
    keepspaces=true,
    числа = слева,
    цифрыep=5pt,
    выставочные пространства = ложь,
    showstringspaces=false,
    шоутабс=ложь,
    вкладка = 2
}
\lstset{стиль=мой стиль}
\начать{документ}
Следующий код будет напрямую импортирован из файла
\lstinputlisting[language=Octave]{BitXorMatrix. m}
\конец{документ}
 


Приведенный выше код выдает следующий результат:

Как видите, цветовая гамма и стиль кода значительно улучшают читабельность.

В этом примере импортируется пакет xcolor , а затем используется команда \definecolor{}{}{} для определения новых цветов в формате rgb, которые будут использоваться позже. Для получения дополнительной информации см.: использование цветов в LaTeX.

По сути, есть две команды, которые генерируют стиль для этого примера:

\lstdefinestyle{mystyle}{...}
Определяет новый стиль листинга кода под названием «mystyle». Внутри второй пары фигурных скобок передаются параметры, определяющие этот стиль; полное описание этих и некоторых других параметров см. в справочном руководстве.
\lstset{style=mystyle}
Включает стиль "mystyle". Эту команду можно использовать в документе для переключения на другой стиль, если это необходимо.

Заголовки и список списков

Как и в случае с плавающими элементами (таблицы и рисунки), к списку можно добавлять подписи для более наглядного представления.

 \begin{lstlisting}[language=Python, caption=пример Python]
импортировать numpy как np
    
def incmatrix(genl1,genl2):
    м = len(genl1)
    n = длина (genl2)
    M = None # чтобы стать матрицей инцидентности
    VT = np.zeros((n*m,1), int) #фиктивная переменная
    
    # вычислить побитовую матрицу xor
    M1 = битовая матрица (genl1)
    M2 = np.triu (bitxormatrix (genl2), 1)
    для я в диапазоне (м-1):
        для j в диапазоне (i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            для k в диапазоне (len (r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;
                
                если M равно None:
                    M = np.copy(VT)
                еще:
                    M = np. concatenate ((M, VT), 1)
                
                VT = np.zeros ((n * m, 1), целое число)
    
    вернуть М
\end{список}
 

 Откройте пример объявлений на обратной стороне


Приведенный выше код выдает следующий результат:

Добавление разделенного запятыми параметра caption=Python example внутри скобок включает заголовок. Эта подпись может быть позже использована в списке объявлений.

 \lstlistoflistings
 

Образец проекта Overleaf

Откройте эту ссылку, чтобы  попробовать пример пакета списков на Overleaf.

Справочник

Поддерживаемые языки

поддерживаемые языки (и их диалекты, если возможно, диалекты указаны в скобках, а диалекты по умолчанию выделены курсивом):

Ассемблер
ABAP (R/2 4.3, R/2 5.0, R/3 3.1, R/3 4.6C, R/3 6.10 ) АСЛ
Ада ( 2005 , 83, 95) Алгол (60, 68 )
Муравей (Motorola68k, x86masm)
Awk ( gnu , POSIX) баш
Базовый (визуальный) C ( ANSI , Гендель, объектив, острый)
C++ (ANSI, GNU, ISO , Visual) Caml ( свет , объектив)
КИЛ Чистый
Кобол (1974, 1985 , IBM) Комал 80
command. com ( WinXP ) Комсол
кш Делфи
Эйфель Элан
Эрланг Эйфория
Фортран (77, 90, 95 ) ГКЛ
Гнуплот Хаскелл
HTML IDL (пусто, CORBA)
сообщить Java (пусто, AspectJ)
JVMIS кш
Языкознание Лисп (пусто, Авто)
Логотип сделать (пусто, гну)
Mathematica (1.0, 3.0, 5.2 ) Матлаб
Меркурий МетаПост
Миранда Мицар
МЛ Модуль-2
МуПАД НАСТРАН
Оберон-2 OCL (декоративная, OMG )
Октава унций
Паскаль (Borland6, Стандарт , XSC) Перл
PHP PL/I
Плазма Постскриптум
POV Пролог
Промела PSTриксы
Питон Р
Уменьшить Рекс
РГБ Рубин
S (пустой, ПЛЮС) САС
Scilab ш
ШЕЛXL Simula ( 67 , CII, DEC, IBM)
СПАРКЛ SQL
ткл (пустой, тк) TeX (AlLaTeX, обычный, LaTeX, простой , примитивный)
VBScript Верилог
VHDL (пустой, AMS) ВРМЛ ( 97 )
XML XSLT

Параметры для настройки стилей листинга кода