Pergunta

É possível ter um comando tex que levará o próximo próximo palavra (ou as próximas cartas até incluir o próximo símbolo de pontuação) como um argumento e não apenas a próxima letra ou {} Grupo?

Eu gostaria de ter um comando caps em certos acrônimos, mas não quero digitar suportes encaracolados repetidamente.

Foi útil?

Solução

Primeiro de tudo, crie seu comando, por exemplo

 \def\capsimpl#1{{\sc #1}}% Your main macro

A solução para obter um espaço ou pontuação:

\catcode`\@=11  
\def\addtopunct#1{\expandafter\let\csname punct@\meaning#1\endcsname\let} 
\addtopunct{ }
\addtopunct{.}    \addtopunct{,}    \addtopunct{?} 
\addtopunct{!}    \addtopunct{;}    \addtopunct{:} 

\newtoks\capsarg
\def\caps{\capsarg{}\futurelet\punctlet\capsx}
\def\capsx{\expandafter\ifx\csname punct@\meaning\punctlet\endcsname\let
       \expandafter\capsend  
       \else \expandafter\continuecaps\fi}

\def\capsend{\expandafter\capsimpl\expandafter{\the\capsarg}}
\def\continuecaps#1{\capsarg=\expandafter{\the\capsarg#1}\futurelet\punctlet\capsx}

\catcode`\@=12

Outras dicas

@Debilski - escrevi algo semelhante ao seu código ativo * para as siglas da minha tese. Eu ativei <e depois def <#1> para imprimir o acrônimo, bem como a expansão, se for a primeira vez que é encontrada. Também fui um pouco do fundo, permitindo a definição das expansões em linha e usando os arquivos .aux para enviar as expansões "de volta no tempo" se forem usadas antes de serem declaradas ou para relatar erros se um acrônimo nunca é declarado.

No geral, parecia que seria uma boa idéia na época - eu raramente precisava <ser CATCODE 12 no meu texto real (já que todas as minhas macros estavam em um arquivo. Então, eu não conseguia prever nenhuma dificuldade. Mas garoto foi quebradiço ... não sei quantas vezes eu acidentalmente quebrei minha construção, mudando algo aparentemente não relacionado. Então, tudo isso para dizer, seja muito Personagens ativos cuidadosos que são remotamente comumente usados.

Por outro lado, com XETEX e caracteres unicode superior, provavelmente é muito mais seguro, e geralmente existem maneiras fáceis de digitar esses caracteres extras, como fazer uma chave multi (ou compor) (eu geralmente mapeio o número ou um dos teclas do Windows para isso), para que, por exemplo, multi-!-! produz ¡). Ou se você estiver executando em EMACs, pode usar o C- para mudar para o modo de entrada Tex brevemente para inserir Unicode digitando o comando tex para ele (embora isso seja uma dor para digitar documentos tex, pois intercepta seu real 'S, e por favor, não tente definir seu próprio personagem de fuga!)

Em relação ao espaço em branco após os comandos: consulte o pacote xspace, E TEX FAQ ITEM Comandos gobble seguindo o espaço.

Agora, por que isso é muito difícil: como você se observou, coisas assim só podem ser feitas alterando os códigos de gato, ao que parece. Os códigos de gato são atribuídos aos personagens quando a Tex os lê, e a Tex lê uma linha de cada vez, para que você não possa fazer nada com outros espaços na mesma linha, IMHO. Pode haver uma maneira de contornar isso, mas eu não o vejo.


Código perigoso abaixo!

Este código fará o que você quiser No final da linha, por isso, se o que você deseja é mais "fluente", digitando sem colchetes, mas você está disposto a acertar 'retornar' após cada sigla (e não executar nenhum indent automático mais tarde), você pode usar isso:

\def\caps{\begingroup\catcode`^^20 =11\mcaps}
\def\mcaps#1{\def\next##1 {\sc #1##1\catcode`^^20 =10\endgroup\ }\next}

Uma solução pode ser definir outro caractere como ativo e usar este para escapar. Isso não remove a necessidade de um personagem de fechamento, mas evita digitar o \caps Macro, facilitando o digite geral.

Portanto, em circunstâncias muito especiais, as seguintes obras.

\catcode`\*=\active
\def*#1*{\textsc{\MakeTextLowercase{#1}}}

Now follows an *Acronym*.

Infelizmente, isso utiliza \section*{} impossível sem definições de macro adicionais.

No Xetex, parece ser possível explorar caracteres unicode para isso, para que se possa definir

\catcode`\•=\active
\def•#1•{\textsc{\MakeTextLowercase{#1}}}

Now follows an •Acronym•.

O que deve reduzir os efeitos em outros comandos, mas é claro que precisa ter o personagem '•' 'Mappendo para o teclado em algum lugar para ser útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top