- Questo topic ha 5 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 15 anni, 3 mesi fa da .
-
Topic
-
Ciao a tutti.Ho in progetto un editor per LaTeX e ne stavo studiando la fattibilità ed eventualmente come implementare alcuni componenti. Adesso stavo ragionando su come creare una sorta di tavolozza con i simboli. L’idea è esportare i simboli che sono contenuti nella Comprehensive LaTeX Symbol List, di cui il codice sorgente è liberamente disponibile.
Quello che vorrei fare è, per ogni simbolo, estrarre il nome del comando e l’immaginina del glifo (più altre cose che qui non interessano). Il problema è che la posizione del glifo che riesco a ottenere è sfasata verticalmente.
Vengo ai dettagli. I simboli da estrarre sono contenuti in tabelle e per ognuno di essi uso un comando \V che salva su un file esterno il nome del simbolo e la posizione del glifo. I primi tentativi li ho fatti smanettando con \pdfsavepos, \pdflastxpos e \pdflastypos, ma poi mi sono imbattuto in zref. Ho scritto un esempio minimo che non richiede di compilare tutta la CLSL:
`\newwrite\SymbolExport
\immediate\openout\SymbolExport=exports.txt\documentclass{article}
\usepackage[savepos]{zref}\newcounter{numofcommands}
% print and save position: visualizza (a PDF) il suo argomento e ne salva la posizione su file
\newcommand\psp[1] {%
\immediate\write\SymbolExport{page = \number\thepage}%
\zsavepos{b\thepage\detokenize{\string#1}}\framebox{#1}\zsavepos{e\thepage\detokenize{\string#1}}%
\immediate\write\SymbolExport{begin = \zposx{b\thepage\string#1},\zposy{b\thepage\string#1}}%
\immediate\write\SymbolExport{end = \zposx{e\thepage\string#1},\zposy{e\thepage\string#1}}%
}% save command: scrive sul file il nome del comando
\newcommand\svc[1] {%
\immediate\write\SymbolExport{command = #1}%
\addtocounter{numofcommands}{1}%
}\newcommand\V[2][] {%
#1 & \psp{#2} &\svc{\string#2}\ttfamily\string#2%
}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{Simboli}
\begin{document}
\begin{tabular}{lll@{\qquad}lll}
\V\textasciicircum$^*$ & \V\textless \\
\V\textbackslash & \V\textparagraph$^\dag$ \\
\V\textbar & \V\textperiodcentered \\
\V\textbraceleft$^\dag$ & \V\textquestiondown \\
\V\textgreater \\
\end{tabular}\immediate\write\SymbolExport{}
\immediate\write\SymbolExport{Comandi esportati: \number\value{numofcommands}}
\immediate\closeout\SymbolExport\end{document}`
Quando compilo ottengo correttamente il file exports.txt, che ha la forma:
`page = 1
begin = 10962208,46493363
end = 11735533,46493363
command = \textasciicircum
page = 1
begin = 20607427,46493363
end = 21562797,46493363
command = \textless
page = 1
begin = 10962208,45530576
end = 11735533,45530576
command = \textbackslash
Comandi esportati: 9
`Vengo al nocciolo della questione: le posizioni che ottengo hanno coordinata y errata. Riporto l’immagine che riesco a ritagliare per \textasciicircum (con altezza che, non riuscendo a determinarla, è fissata a 150 pixel):

Questo è il modo in cui procedo (non sono sicuro che serva e quindi lo metto in piccolo). Converto innanzitutto le pagine PDF in immagini: uso il formato PNG monocromatico con risoluzione di 600 pixel per pollice. Poi, per ogni simbolo contenuto in exports.txt, converto le coordinate begin e end da punti scalati in pixel, sulla base della risoluzione specificata prima. Ovvero per ogni coordinata faccio:
`pixel = punti_scalati * 600 / (65536 * 72.27)`
Infine, per ogni simbolo ritaglio l’immagine da begin a end.Quello che vorrei esportare è esattamente la porzione di pagina contenuta all’interno di ogni \framebox, ma invece la posizione ha coordinata verticale sfasata. In realtà, ho notato che non si tratta di un semplice sfasamento, ma c’è anche un fattore di scala (vale a dire che lo sfasamento dipende dalla posizione nella pagina). Inoltre, anche usando \pdfsavepos e \pdflastypos avevo lo stesso problema.
Un’altra questione è che la posizione verticale è uguale prima e dopo aver visualizzato l’oggetto, non riesco quindi a determinare l’altezza della porzione da ritagliare. Immagino che ciò è dovuto al fatto che sono in modo orizzontale, ma allora: è possibile ridefinire \framebox e ottenere esattamente i contorni che traccia?
Grazie
Antonio
- Devi essere connesso per rispondere a questo topic.