– Se sul verso spezzato cade il numero di verso da visualizzare, esso viene visualizzato DUE volte, una per ogni emistichio. Li conta giusti, ma è’ molto brutto. è una finezza, ma sai…
Questo sembra essere un piccolo bug del pacchetto verse (non credo possa essere considerata una feature).
– Come si fa per evitare che venga conteggiata una didascalia o altro elemento accessorio?
Un po’ complesso forse comunque fino a qui sono soddisfattissimo, e ti ringrazio molto per l’aiuto
È un po’ complicato, perché in realtà la didascalia è qualcosa di estraneo al flusso dei versi, e, a rigore, ogni volta l’ambiente verse andrebbe interrotto e ripreso. Ma a quel punto dovremmo salvare e ripristinare tutti i valori dei parametri, compresi i vari rientri, i numeri di riga, ecc.; tra l’altro una didascalia può apparire anche tra due emistichi…
Però possiamo approfittare del fatto che tanto dobbiamo mettere le mani nel codice di verse per eliminare il bug di cui sopra, per truccare un po’ le carte, e trovare una soluzione che funzioni bene almeno in casi non troppo complessi.
Cominciamo con il modificare la macro del pacchetto verse che gestisce l’avanzamento dei versi:
`
\newif\ifbroken
\brokenfalse
\makeatletter
\renewcommand{\@vscentercr}{%
\ifhmode \unskip\else \@nolnerr\fi
\@vsifgt{\brokentrue\verselinebreak}{%
\brokenfalse
\@vstypelinenum%
\incr@vsline
\par\@ifstar{\nobreak\@vsxcentercr}{%
\@vsifbang{\@ifnextchar[ {\@vsicentercr}{}}{\@vsxcentercr}}}}
\makeatother
`
In rosso sono segnate le mie modifiche. Nell’originale \@vstypelinenum, che è la macro responsabile per la stampa del numero di riga si trova fuori da \@vsifgt e viene quindi eseguita ad ogni interruzione di linea (\\). Con la modifica fatta il numero non viene stampato quando il compilatore incontra \\>. Già che c’ero, ho introdotto un booleano (\ifbroken) che ci tornerà utile per il seguito.
Infatti lo uso subito, per gestire con una sola macro (\Pers), tutti i casi in cui mi serve di stampare il nome di un personaggio, sia che si riferisca ad un verso intero, a un primo o a secondo emistichio:
`
\newcommand{\Pers}[1]{%
\ifbroken\hskip-\vindent\fi
\flagverse{\textsc{#1}}
\ifbroken\hskip\vindent\fi
}
`
Ora le didascalie:
`
\newcommand{\Dida}[1]{%
\ifbroken\hskip-\vindent\else\addtocounter{poemline}{-1}\fi
\vin\emph{(#1)}
}
`
Se ci troviamo nel mezzo di due emistichi, dobbiamo eliminare il rientro aggiuntivo, ma non c’è bisogno di modificare il contatore dei numeri di riga, perché non c’è stato nessun avanzamento. Altrimenti è il contrario. Ricordati che se la didascalia sta tra due emistichi deve essere terminata con il comando \\>, altrimenti con \\.
Infine, ho modificato \setbvindent in modo da non dover più utilizzare [\versewidth]:
`
\newlength{\bvindent}
\newcommand{\setbvindent}[1]{%
\settowidth{\bvindent}{#1}%
\addtolength{\bvindent}{-\vindent}%
\hskip\bvindent\ignorespaces
}
`
Così modificato, \setbvindent deve essere posizionato sulla riga che contiene il secondo emistichio.
Ecco un esempio completo, compilabile:
`
\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage{verse}
\newif\ifbroken
\brokenfalse
\makeatletter
\renewcommand{\@vscentercr}{%
\ifhmode \unskip\else \@nolnerr\fi
\@vsifgt{\brokentrue\verselinebreak}{%
\brokenfalse
\@vstypelinenum%
\incr@vsline
\par\@ifstar{\nobreak\@vsxcentercr}{%
\@vsifbang{\@ifnextchar[ {\@vsicentercr}{}}{\@vsxcentercr}}}}
\makeatother
\newcommand{\Pers}[1]{%
\ifbroken\hskip-\vindent\fi
\flagverse{\textsc{#1}}
\ifbroken\hskip\vindent\fi
}
\newcommand{\Dida}[1]{%
\ifbroken\hskip-\vindent\else\addtocounter{poemline}{-1}\fi
\vin\emph{(#1)}
}
\newlength{\bvindent}
\newcommand{\setbvindent}[1]{%
\settowidth{\bvindent}{#1}%
\addtolength{\bvindent}{-\vindent}%
\hskip\bvindent\ignorespaces
}
\begin{document}
\settowidth{\versewidth}{Io scacciato!\ldots{} Io bandito!\ldots{} E il fiero insulto}
\begin{verse}[\versewidth]
\poemlines{5}
Io scacciato!\ldots{} Io bandito!\ldots{} E il fiero insulto\\
Io Don Sallustio di Bazan dovrei\\
\Dida{Didascalia che serve solo per il debug}\\
Soffrir tacendo e inulto?\ldots{}\\
Ah! no, per dio!\ldots{} Madrid e questa Corte\\
Esule io lascio\ldots{} ma per poco:\\>
\Dida{volgendosi al ritratto della Regina con un gesto di minaccia}\\>
\setbvindent{Esule io lascio\ldots{} ma per poco:} un giorno\\
Mi rivedrà costei,\\
Come un genio fatal di morte!\ldots{}\\>
\Dida{passando dall'ira all'abbattimento}\\>
\setbvindent{Come un genio fatal di morte!\ldots{}} Un giorno!\ldots{}\\
Sì, ma palese intanto\\
A tutti fia lo scorno\\
Di questo colpo, che m'umilia, ahi! quanto!\ldots{}\\!
\end{verse}
\settowidth{\versewidth}{Violets are red, roses are blue,}
\begin{verse}[\versewidth]
\Pers{Beauty:}Violets are red,\\>
\Pers{Beast:}\setbvindent{Violets are red,} roses are blue,\\
\Pers{Beauty:}The world is beautiful\\>
\Pers{Beast:}\setbvindent{The world is beautiful} and so do I.
\end{verse}
\end{document}
`
Non ti garantisco che gestisca casi complicati, ma dovrebbe risolvere i due problemi che avevi indicato.
Ciao,
Max