Modification de l’épaisseur en chiffres PostScript (.ps ou .eps) via des commandes shell Unix?

J’ai beaucoup de figures (graphiques) au format postscript (.eps) avec lesquelles je souhaite épaissir les plots.

J’ai trouvé le code suivant, mais le fichier de sortie n’est pas différent. Je me demandais ce que je faisais mal.

Le code:

# get list of all arguments set args = ($*) # if not enough arguments, complain. if ($#args < 2) then echo "Usage: ps_thicken ps_file factor" echo "Thickens all lines in a PostScript file by changing the linewidth macro." echo "Result goes to standard output." exit 1 endif sed -e "s/^\/lw {\(.*\) div setlinewidth/\/lw {$2 mul \1 div setlinewidth/" $1 

Maintenant, pour l’exécuter depuis ma ligne de commande, j’utilise la commande (nom_fichier est ps_thicken et dispose des permissions appropriées):

  ./ps_thicken old_file.eps 10 > new_thick_file.eps 

Ce que je pensais devrait rendre tout 10 fois plus épais, mais ça ne change rien.

Toute aide serait grandement appréciée, je suis assez nouveau pour le script shell!

PostScript est un langage de programmation, il n’est donc pas vraiment possible d’apporter des modifications de manière automatisée comme celle-ci. Au moins pas sans écrire un programme PostScript pour le faire!

Notez que linewidth n’est pas une macro (PostScript n’a pas de macros) son opérateur am. Ce que le code que vous avez posté pour sed (si je me souviens bien) est la définition de / lw et le remplace par une version modifiée. Le problème avec cela est que / lw est une déclinaison de fonction dans un programme PostScript particulier. La plupart des programmes PostScript n’auront pas (ou n’utilisent) pas une fonction appelée «lw».

Vous feriez bien mieux d’append le code du programme PostScript avec quelque chose comme:

 /oldsetlinewidth /linewidth load def /setlinewidth {2 div oldsetlinewidth} bind def 

Cela définira (dans le dictionnaire actuel) une fonction appelée «setlinewidth». Maintenant, si le programme suivant utilise simplement la définition actuelle de setlinewdith lors de la création de ses propres fonctions, il utilisera la définition redéfinie ci-dessus. Ce qui aura pour effet de diviser toutes les largeurs de lignes par 2 dans ce cas. Évidemment, pour augmenter la largeur, vous utiliseriez quelque chose comme 2 mul au lieu de 2 div.

Notez que ceci n’est nullement infaillible, il est tout à fait possible pour un programme PostScript de charger explicitement la définition de setlinewidth à partir de systemdict, et vous ne pouvez pas le remplacer (du moins pas facilement) car systemdict est en lecture seule.

Cependant, il est peu probable qu’un programme EPS tire de telles astuces, alors cela devrait probablement vous convenir.

[basé sur des commentaires]

Hmm, vous voulez dire ‘échec à importer’ dans une application ou autre chose?

Si vous chargez le fichier EPS dans une application, il suffit de le mettre en face de celui-ci. EPS (contrairement à PostScript) est nécessaire pour suivre certaines règles, donc pour le modifier avec succès, vous devrez les suivre. Cela inclut le saut de toute prévisualisation EPS.

Ce n’est pas vraiment un exercice sortingvial. Votre meilleur pari est probablement d’exécuter les fichiers via Ghostscript, vous pouvez faire beaucoup en exploitant un interpréteur PostScript pour faire le travail.

Commencez avec les 2 lignes de PostScript ci-dessus dans un fichier, puis exécutez le fichier EPS que vous souhaitez “modifier” via Ghostscript, à l’aide du périphérique eps2write. Cela produira un nouvel EPS avec les modifications “cuites”.

Par exemple (en supposant que le code de modification de largeur de ligne se trouve dans ‘lw.ps’):

 gs -sDEVICE=eps2write -o out.eps lw.ps file.eps 

Mais sachez que l’EPS qui en résulte est un programme complètement réécrit et n’a aucun rapport avec l’original. En particulier, toute vignette de prévisualisation sera perdue.