my blog

Friday 30 July 2004

LaTeX, A4 et letter (suite)

Je préfère écrire la réponse ici, et pas en commentaire à la précédente entrée.

Après avoir un petit peu plus cherché (c'est facile, quand on connait plus précisément le problème), il apparait que je ne suis pas le seul à avoir ce problème. Et il existe visiblement une solution un peu plus simple que celle que j'ai indiquée précédemment. Il suffit d'ajouter au début du fichier .tex :

\pdfpagewidth=8.5 true in
\pdfpageheight=11 true in

Ce qui est dommage, c'est que les développeurs n'ont pas l'air de saisir qu'une option de ligne de commande serait utile pour cela... (mais il est vrai que beaucoup d'autres options méritent aussi d'être en ligne de commande).

LaTeX, A4 et letter

La différence, c'est bien. Mais bon, c'est aussi assez embêtant de temps en temps. Prenez par exemple le papier. Il a une taille standard : le A4. Cela doit être standard partout dans le monde. Sauf aux Etats-Unis (et certainement dans quelques autres pays aussi, mais chut...) : là-bas, la taille standard est letter. Pas bien grave, me direz-vous. Et bien si. Quand on doit envoyer un article à des américains, ils le veulent au format letter. Pas de problème. Sauf quand on utilise LaTeX.

En effet, LaTeX, lorsqu'il est installé chez des pauvres européens, est configuré pour générer du A4. Et il n'est pas possible de lui faire générer facilement un autre format. C'est une horreur, particulièrement quand on utilise pdflatex (et qu'on n'a pas le choix car on a des images au format PDF). Il faut trouver les bons fichiers de configuration et les éditer. Voici donc ce qu'il faut faire.

Pour corriger dvips, il faut éditer /usr/share/texmf/dvips/config/config.ps et changer les lignes :

@ A4size 210mm 297mm
@+ %%PaperSize: A4

en les commentant avec % :

% @ A4size 210mm 297mm
% @+ %%PaperSize: A4

Je ne suis pas du tout sûr que ce soit une solution propre... On peut modifier le comportement de dvips sans modifier la configuration par défaut en utilisant l'option -t letter dans la ligne de commande.

Pour corriger pdflatex (ce qui m'intéressait vraiment), il faut éditer /usr/share/texmf/pdftex/config/pdftex.cfg et changer les lignes :

page_width 210 true mm
page_height 297 true mm

en ceci :

page_width 8.5 true in
page_height 11 true in

Et là, il n'y a pas d'option de ligne de commande pour modifier le comportement par défaut. Donc, à moins que quelqu'un ne prenne le temps d'écrire un patch ou de reporter le problème au bon endroit, c'est la seule solution à mon problème (du moins, seule solution que je connais).

Source de la solution : cette entrée dans le journal de David Mellis.

gethostname et FQDN

Plusieurs programmes ont besoin d'avoir le FQDN de l'hôte sur lequel ils tournent, notamment lorsqu'ils communiquent avec des programmes ou des personnes utilisant une autre machine. Le réflexe naturel est d'utiliser gethostname. Seulement voilà : gethostname peut parfois retourner le nom de l'hôte, sans le domaine. Ainsi, il est possible que gethostname renvoie 3rivieres alors que je souhaite obtenir 3rivieres.vuntz.net. Et le problème est qu'il n'y a pas de recette miracle pour obtenir directement 3rivieres.vuntz.net. Il faut mettre les mains dans le cambouis. Voici un petit exemple de code qui montre comment faire.

#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 255
#endif

static void is_fqdn (char *display, char *name)
{
	if (strchr (name, '.') != NULL) {
		if (strncasecmp (name, "localhost", 9) == 0) {
			printf ("%s is a FQDN, but it's localhost: "
				"%s\n", display, name);
		} else {
			printf ("%s is a FQDN: %s\n", display, name);
		}
	} else {
		printf ("%s isn't a FQDN: %s\n", display, name);
	}
}

int main (int argc, char **argv)
{
	char             hostname[HOST_NAME_MAX];
	struct hostent  *he;
	char           **alias;
	char             buffer[64];

	if (gethostname (hostname, HOST_NAME_MAX)) {
		perror("gethostname");
		return 1;
	}

	/* man gethostname(2): we don't know if hostname is NUL-terminated */
	hostname[HOST_NAME_MAX - 1] = '\0';

	is_fqdn ("gethostname return value", hostname);

	he = gethostbyname (hostname);
	if (he == NULL) {
		herror ("gethostbyname");
		return 1;
	}

	is_fqdn ("The name returned by gethostbyname", he->h_name);

	alias = he->h_aliases;
	while (alias && *alias) {
		snprintf (buffer, 64, "Alias %d returned by gethostbyname",
			  alias + 1 - he->h_aliases);
		is_fqdn (buffer, *alias);
		alias++;
	}

	return 0;
}

Allez, maintenant, j'envoie un petit patch aux auteurs de libspf2 pour pouvoir fermer mon bug.

by Vincent