
Я хочу создать команду для упрощения использования команды lstinputlisting
из списка пакетов, которая может принимать один параметр в качестве пути к файлу и передавать его как параметру заголовка, так и параметру пути lstinputlisting. Одним словом, использовать путь к файлу в качестве заголовка.
Рассмотрим следующий исходный код LaTeX:
\documentclass[UTF8]{ctexart}
\usepackage{listings}
\newcommand{\myincludecode}[1]{\lstinputlisting[caption=#1, language=matlab]{#1}}
\newcommand{\mysecondincludecode}[2]{\lstinputlisting[caption={#2}, language=matlab]{#1}}
\begin{document}
\myincludecode{main.m} % line 10
\myincludecode{gen_data.m} % line 11
\mysecondincludecode{main.m}{main.m} % line 13
\mysecondincludecode{gen_data.m}{gen\_data.m} % line 14
\end{document}
Очевидно, что команды в строках 13 и 14 работают хорошо: они правильно включают соответствующий файл и выводят соответствующие подписи.
Строка 10 также работает хорошо. Однако строка 11 включает соответствующий файл, но не выводит никаких подписей. В файле журнала указано:
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Extra }, or forgotten $.
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Missing } inserted.
Очевидно, что подчеркивание нарушает мою команду. Поэтому мне интересно, как изменить ее, myincludecode
чтобы она работала — даже при встрече некоторых специальных символов, таких как подчеркивание здесь.
решение1
решение2
В mathmode
подчеркивании есть функция. Она меняет следующий символ на нижний индекс. Поэтому она ожидает знак $
. Это простое решение вашей проблемы.
\documentclass[UTF8]{ctexart}
\usepackage{listings}
\begin{document}
\begingroup
\newcommand{\myincludecode}[1]{\catcode`_=11\lstinputlisting[caption=#1, language=matlab]{#1}}
\myincludecode{main.m}
\myincludecode{gen_data.m}
\endgroup
$1_2$
\end{document}
Catcode означает код категории. Категория — _
это 8, которая назначает ей некоторую функцию, если я изменю ее на 11, она изменит подчеркивание на буквенную категорию, что, вероятно, вам и нужно. Добавление этой команды между \begingroup
& \endgroup
делает функцию подстрочного индекса нетронутой вне ее области действия.
решение3
Вам следует избегать «_» в именах файлов и в тегах cite или ref, или вам следует использовать пакет babel с его элементами управления активными символами, или вам следует указать опцию [strings], которая пытается переопределить несколько команд (и может работать не идеально). Даже без опции [strings] или babel вы можете время от времени использовать подчеркивания, например: «\include{file\string_name}».
Операция по умолчанию довольно проста и не требует настройки; но вы должны избегать использования «_» в любом месте, где LaTeX использует аргумент как строку символов для некоторой функции управления или как имя. К ним относятся теги для \cite и \ref, имена файлов для \input, \include и \includegraphics, имена сред, имена счетчиков и параметры размещения (например, [t]). Проблема с этими контекстами в том, что они являются «перемещаемыми аргументами», но LaTeX не «включает» для них «механизм \protect».
Если вам нужно использовать символ подчеркивания в этих местах, опция пакета [strings] предоставляется для переопределения команд, которые принимают такой строковый аргумент, чтобы применялась защита (с \protect, сделанным как \string). Список команд, на которые влияет это положение, приведен в \UnderscoreCommands, с \do перед каждой; плюс несколько других, охватывающих \input, \includegraphics, \cite, \ref и их варианты.
Пожалуйста, посмотри--http://ctan.imsc.res.in/macros/latex/contrib/underscore/underscore.pdf и--Список файлов с подчеркиваниями в имени/пути