Как создать новую команду, единственный параметр которой может применяться к параметрам «caption» и «path» `lstinputlisting`

Как создать новую команду, единственный параметр которой может применяться к параметрам «caption» и «path» `lstinputlisting`

Я хочу создать команду для упрощения использования команды 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

Детокиньте аргумент:

\documentclass[UTF8]{ctexart}
\usepackage[T1]{fontenc}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=\detokenize{#1}, language=matlab]{#1}}

\begin{document}

\myincludecode{main.m}
\myincludecode{gen_data.m} 

\end{document}

введите описание изображения здесь

решение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 и--Список файлов с подчеркиваниями в имени/пути

введите описание изображения здесь введите описание изображения здесь

Связанный контент