Como criar um novo comando cujo parâmetro único pode ser aplicado aos parâmetros "legenda" e "caminho" de `lstinputlisting`

Como criar um novo comando cujo parâmetro único pode ser aplicado aos parâmetros "legenda" e "caminho" de `lstinputlisting`

Quero criar um comando para simplificar o uso do comando lstinputlistingdas listagens de pacotes, que pode aceitar um único parâmetro como caminho do arquivo e passá-lo para o parâmetro de legenda e caminho de lstinputlisting. Em uma palavra, use o caminho do arquivo como legenda.

Considere a seguinte fonte 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}

Claramente, os comandos nas linhas 13 e 14 funcionam bem, pois incluem corretamente o arquivo correspondente e imprimem as legendas correspondentes.

A linha 10 também funciona bem. No entanto, a linha 11 inclui o arquivo correspondente, mas não produz legenda. O arquivo de log diz:

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.

É óbvio que o sublinhado interrompe meu comando. Então, gostaria de saber como modificar myincludecodepara que funcione - mesmo quando encontro alguns caracteres especiais, como o sublinhado aqui.

Responder1

Destokenize o argumento:

\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}

insira a descrição da imagem aqui

Responder2

No mathmodesublinhado tem uma função. Ele muda o próximo caractere para subscrito. Portanto, espera um $sinal. Esta é uma solução simples para o seu problema.

\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 significa código de categoria. A categoria de _é 8 que atribui alguma função a ele, se eu mudar para 11, ele muda o sublinhado para uma categoria de letra, que provavelmente é o que você deseja. Adicionar este comando entre \begingroup& \endgroupfaz com que o subscrito funcione intacto fora de seu escopo.

Responder3

Você deve evitar “_” em nomes de arquivos e em tags cite ou ref, ou deve usar o pacote babel, com seus controles de caracteres ativos, ou deve dar a opção [strings], que tenta redefinir vários comandos (e pode não funciona perfeitamente). Mesmo sem a opção [strings] ou babel, você pode usar sublinhados ocasionais como: “\include{file\string_name}”.

A operação padrão é bastante simples e não necessita de personalização; mas você deve evitar usar “_” em qualquer lugar onde o LaTeX use um argumento como uma sequência de caracteres para alguma função de controle ou como um nome. Isso inclui as tags para \cite e \ref, nomes de arquivos para \input, \include e \includegraphics, nomes de ambiente, nomes de contadores e parâmetros de posicionamento (como [t]). O problema com estes contextos é que eles são 'argumentos móveis' mas o LaTeX não 'liga' o “mecanismo \protect” para eles.

Se você precisar usar o caractere de sublinhado nesses locais, a opção de pacote [strings] é fornecida para redefinir comandos que usam tal argumento de string para que a proteção seja aplicada (com \protect feito para ser \string). A lista de comandos afetados por esta disposição é fornecida em \UnderscoreCommands, com \do antes de cada um; além de vários outros cobrindo \input, \includegraphics, \cite, \ref e suas variantes.

Por favor, veja--http://ctan.imsc.res.in/macros/latex/contrib/underscore/underscore.pdf e--Listagem de um arquivo com sublinhados em seu nome/caminho

insira a descrição da imagem aqui insira a descrição da imagem aqui

informação relacionada