10
votes

Commande personnalisée pour '\ begin {environnement} ... \ fin {environnement}'

Pour entrer un bit de dialogue à l'aide du package code> scénario code>, je dois utiliser

\dialogue{Johnny} Some dialogue.
\dialogue{Jane} I see.


2 commentaires

Selon l'éditeur que vous utilisez, vous pouvez également examiner également un package d'extraits.


+1 C'est une question vraiment intéressante


3 Réponses :


10
votes

Essayez ceci:

\newcommand{\dialogueline}[2]{\begin{dialogue}{#1} #2 \end{dialogue}}

% Usage example:
\dialogueline{Johnny}{Some dialogue.}  
\dialogueline{Jane}{I see.}  


2 commentaires

C'est une bonne réponse, mais si quelqu'un sait comment reproduire le format exact demandé par l'affiche originale, ce serait bien de voir.


Je pense que c'est à peu près aussi proche que possible de ce que l'affiche veut. Il doit y avoir des bretelles autour du texte afin que le latex sait où mettre \ commencez {dialogue} et \ fin {dialogue} correctement. Aussi, j'ai utilisé \ \ dialoguelaine au cas où il y a déjà une autre commande nommée \ dialogue , mais si ce n'est pas le cas, l'affiche peut remplacer \ dialogueline Avec \ dialogue à la place s'il ne provoque aucune erreur.



12
votes

Vous pouvez en fait obtenir exactement ce que vous voulez: xxx

Ce code doit être \ MakeAreTletter -Protected -Eraté entouré de \ MakeArelette \ Makeather ( edit : cela signifie que vous mettez \ makeatletter avant la définition et \ makeather après-le), ou dans un .sty fichier. Notez qu'un environnement nommé dialogue définit une commande nommée \ dialogue , vous avez donc besoin d'un nom différent. Ne changez pas le formatage!

La façon dont il fonctionne est que \ dialogueline est une commande qui ne prend aucun argument, mais se développe à plusieurs séquences. Premièrement, un jeton d'ouverture de groupe, pour mettre tout ce qui suit dans sa propre portée. Deuxièmement, le \ catcode` ^^ m = 12 séquence. Latex attribue chaque lettre A Catcode : un nombre qui dit quel type il est. Par exemple, le backslash est CATCODE 0, le constructeur de nom de commande; Les lettres sont Catcode 11; et les caractères d'impression de non-lettres, tels que le signe au signe, sont CATCODE 12. Cette séquence rend ^^ m , le caractère NEWLINE, a du CATCODE 12, afin que nous puissions interagir avec elle. Enfin, nous écrivons la commande \ dialogueline @ eol , qui fait la levée lourde.

Suivant, nous définissons \ dialogueline @ eol . Nous le faisons dans un groupe où le personnage de la nouvelle ligne est CATCODE 12, comme ce sera le lieu où \ dialogueline est élargi. Notez que c'est pourquoi vous ne pouvez pas casser la deuxième ligne avec une nouvelle ligne, ce serait interprété comme texte. Ensuite, nous définissons \ dialogueline @ eol pour prendre deux arguments, se terminant par une nouvelle ligne; Il se développe en prenant le premier argument (que vous passez en bretelles) et en le transmettant comme une dispute à l'environnement de dialogue et en passant le deuxième argument (tout après la première et avant la fin de la ligne) le corps de l'environnement. Enfin, \ dialogueline @ eol termine le groupe ouvert dans \ dialogueline , de sorte que la modification du CATCODE de ^^ m n'est pas visible nulle part autre. Compte tenu de cela, vous pouvez écrire xxx

et tout devrait fonctionner.


6 commentaires

C'est plutôt intelligent. Je ne savais pas sur \ catcode jusqu'à maintenant. Bien que ma solution fonctionne pour tout ce qui est placée à l'intérieur des accolades, le vôtre fonctionnera pour une doublure et est plus proche de la syntaxe demandée de l'Asker.


L'astuce est en fait moins sur les cacodes et plus sur la correspondance de modèle dans \ \ \ : vous pouvez aussi faire quelque chose comme \ gdef \ dialogueline @ eol # 1: # 2 ^^ m Pour être capable d'écrire \ dialogueline johnny: un dialogue. . Le commutateur CATCODE est de sorte que la fin d'une ligne ne soit que traitée comme un caractère d'espace et ignoré, mais est traitée à la place comme un caractère assorti. Vous avez raison que cela puisse interdire certaines chaînes valides (même si certaines d'entre elles peuvent être autorisées en caché la chaîne assortie en bretelles bouclées, par exemple \ dialogueline {alexandre: le super}: mourir! ), mais C'est bien pour les raccourcis et les DSL intégrés.


Vrai bien. Fonctionne comme vous le dites. Merci pour l'explication minutieuse!


En fait, j'ai eu une "utilisation de \ dialogueline ne correspond pas à sa définition" Erreur lorsque j'ai utilisé \ Makeather, mais cela fonctionne très bien avec \ Makeatletter.


Désolé, je n'ai pas clarifié cela - la définition doit venir après \ makeatletter avant \ makeather . (Le premier change le cacode de @ à celui d'une lettre, il peut donc faire partie des noms de séquence de contrôle; ce dernier le change.)


J'ai compris. Cela a fonctionné juste bien en sandwich entre deux commandes \ Makeatterter, mais je suppose que ce n'est pas vraiment la syntaxe correcte. Merci encore.



3
votes

Si vous supposez que chaque boîte de dialogue occupe un paragraphe (généralement, elle commence et se termine par une pause de paragraphe double ligne), alors il existe une autre façon d'avoir \ dialogue prend juste un argument: < PRE> XXX

Ce code est un type de sale et d'un-latexy -it -it sets \ everypar sans se soucier de son contenu existant et de sa latex a des abstractions plus propres pour le faire, que je ont oublié, mais le principe devrait être clair.


1 commentaires

C'est intelligent, je n'avais pas vu cette technique auparavant.