
Quero criar um comando para simplificar o uso do comando lstinputlisting
das 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 myincludecode
para que funcione - mesmo quando encontro alguns caracteres especiais, como o sublinhado aqui.
Responder1
Responder2
No mathmode
sublinhado 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
& \endgroup
faz 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