J'ai écrit une macro appelée \dupli qui m'est utile pour créer des polycopiés au format A5 sur du papier A4.

J'ai voulu m'en servir avec un code (page 758 du manuel de TikZ) pour construire un graphique, afin d'apprendre à les construire avec TikZ uniquement (je veux d'abord comprendre le code de base).

Lorsque je commente la macro, le code compile, lorsque je décommente, le code plante et affiche l'erreur :

Ouvrir dans l'éditeur Overleaf
Package tikz Error: Semicolon expected.

Pensant que le problème pouvait venir de babel, j'ai ajouté des \shorthandoff{:;} ainsi que la librairie \usetikzlibrary{babel}.

Cela reste sans effet : j'en conclus que le problème vient de la macro que j'ai écrite.

Merci de vos lumières.

Voici un ECM :

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper, 11pt,landscape]{article}  % Présentation générale et mise en page           
\usepackage[left=0.5cm, right=0.5cm, top=0.6cm, bottom=0.6cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}            
\usepackage{amsmath, amsfonts, amssymb} 
\usepackage[frenchb]{babel}            % Règles françaises de typographie 
\usepackage{pgf,tikz}               
\usetikzlibrary{datavisualization}
\usetikzlibrary{datavisualization.formats.functions}
\usetikzlibrary{babel}

% Nouvelle commande \dupli[]{}
% Le premier argument est le nombre de double cadres
% Le deuxième argument est le contenu qui est dupliqué dans chaque cadre. 
\newlength{\ligne}          % nouvelle largeur appelée "ligne"
\newcommand{\dupli}[2]{%    
\setlength{\ligne}{0.46\textwidth}%
\newsavebox{\maboite}%
\savebox{\maboite}{%
    \par \noindent%
    \hspace*{\fill}%
    \parbox{%                       % boîte sans cadre pouvant contenir des paragraphes
        0.46\textwidth}{%               % largeur du texte identique à celle du cadre
        \noindent\makebox[\ligne][c]{%
            \begin{minipage}[c]{\ligne}{#2}\end{minipage}%
        }%
    }%
    \hspace*{\fill}%
}%
\foreach \i in {1,...,#1} {%
    \vspace*{\stretch{1}}%
    \parbox{\textwidth}{%
    \hspace*{\fill}%
    \usebox{\maboite}%
    \hfill\vrule\hfill%
    \usebox{\maboite}%
    \hspace*{\fill}{\null}%
    }%
    \vspace*{\stretch{1}}%
    \par%
}%
\vfill%
}

\begin{document}
\dupli{3}{
\begin{tikzpicture}
\shorthandoff{:;}
\datavisualization [school book axes, visualize as smooth line]
data [format=function] {
var x : interval [-2:2];
func y = \value x*\value x + 1;
};
\shorthandon{:;}
\end{tikzpicture}
}
\end{document}

Posée 03 Jui '17, 14:43

Andr%C3%A9C's gravatar image

AndréC
6111124
Taux d'acceptation : 25%

Modifiée 10 Aoû '17, 17:06

Pathe's gravatar image

Pathe ♦♦
7.4k28196245


C'est un problème courant dû au changement de catcode, un exemple classique est \textbf{\verb+\alpha+}. Ici on peut prendre comme exemple :

Ouvrir dans l'éditeur Overleaf
\textcolor{red}{%
\begin{tikzpicture}
\datavisualization [school book axes, visualize as smooth line]
data [format=function] {
var x : interval [-2:2];
func y = \value x*\value x + 1;
};
\end{tikzpicture}}

Une solution est de créer un environnement Dupli qui fait le travail de la commande \dupli. Ci-dessous une version approximative :

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper, 11pt,landscape]{article} 
\usepackage[left=0.5cm, right=0.5cm, top=0.6cm, bottom=0.6cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}            
\usepackage{amsmath,  amssymb} 
\usepackage[frenchb]{babel}            % Règles françaises de typographie 
\usepackage{tikz}               
\usetikzlibrary{datavisualization}
\usetikzlibrary{datavisualization.formats.functions}
\usetikzlibrary{babel}

% Nouvelle commande \dupli[]{}
% Le premier argument est le nombre de double cadres
% Le deuxième argument est le contenu qui est dupliqué dans chaque cadre.

\newsavebox{\maboite}%

\newlength{\ligne}          % nouvelle largeur appelée "ligne"
\newcommand{\dupli}[2]{%    
\setlength{\ligne}{0.46\textwidth}%
\savebox{\maboite}{%
    \par \noindent%
    \hspace*{\fill}%
    \parbox{%                       % boîte sans cadre pouvant contenir des paragraphes
        0.46\textwidth}{%               % largeur du texte identique à celle du cadre
        \noindent\makebox[\ligne][c]{%
            \begin{minipage}[c]{\ligne}#2\end{minipage}%
        }%
    }%
    \hspace*{\fill}%
}%
\foreach \i in {1,...,#1} {%
    \vspace*{\stretch{1}}%
    \parbox{\textwidth}{%
    \hspace*{\fill}%
    \usebox{\maboite}%
    \hfill\vrule\hfill%
    \usebox{\maboite}%
    \hspace*{\fill}{\null}%
    }%
    \vspace*{\stretch{1}}%
    \par%
}%
\vfill%
}

\newenvironment{Dupli}[1]{%
\def\mtfois{#1}%
\setbox\maboite\hbox\bgroup
\begin{minipage}[c]{.46\textwidth}}{%
\end{minipage}\egroup
\foreach \i in {1,...,\mtfois} {%
    \vspace*{\stretch{1}}%
    \parbox{\textwidth}{%
    \hspace*{\fill}%
    \usebox{\maboite}%
    \hfill\vrule\hfill%
    \usebox{\maboite}%
    \hspace*{\fill}{\null}%
    }%
    \vspace*{\stretch{1}}%
    \par%
}%
\vfill}

\begin{document}
\begin{Dupli}{2}
\begin{tikzpicture}
\datavisualization [school book axes, visualize as smooth line]
data [format=function] {
var x : interval [-2:2];
func y = \value x*\value x + 1;
};
\end{tikzpicture}
\end{Dupli}

\end{document}
Lien permanent

Publiée 03 Jui '17, 22:18

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Modifiée 10 Aoû '17, 17:08

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

Merci beaucoup, cela fonctionne parfaitement. Si je crée un environnement, n'ai je pas intérêt à en faire un package personnel ? Et si oui comment ?

(03 Jui '17, 22:51) AndréC Andr%C3%A9C's gravatar image
1

@AndréC Il suffit d'ajouter le code (définition) de l'environnement au fichier sty.

Remarque Pour éviter la répétition de code il est préférable de créer une nouvelle commande \AndreCforeach qui fait \foreach \i in {1,...,\mtfois} {% ..... \vfill}.

(04 Jui '17, 00:11) touhami touhami's gravatar image

@Touhami, Merci, j'ai créé un package perso où j'ai placé le code, cela fonctionne parfaitement et c'est bien plus pratique. Concernant la répétition de code, vous avez raison mais vous remarquerez que je déclare une longueur \ligne et je ne m'en ressers pas partout où je le pourrai...

Cette macro évolue au fil de mes besoins et de mon apprentissage de TeX et de LaTeX. Pour l'instant elle me suffit même si je compte bien l'améliorer...

(04 Jui '17, 00:38) AndréC Andr%C3%A9C's gravatar image

@touhami, vous dites que c'est un problème courant du au changement de catcode. Je n'ai pas trouvé de référence ni d'articles sur ce problème. En avez-vous qui expliquent plus en détail les subtilités de ce problème ?

(19 Jui '17, 01:49) AndréC Andr%C3%A9C's gravatar image
1

@AndréC Vous pouvez, par exemple, voir :

TeXbook le dernier paragraphe du chapitre 8 The Characters You Type ( Double Danger).

TeX pour l’impatient, chapitre 10 Trucs et astuces, paragraphe Changer des codes de catégorie.

Cette entrée de UK TeX FAQ

(20 Jui '17, 11:40) touhami touhami's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.