\input juste une partie d'un fichier

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
touhami
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 433
Inscription : dimanche 11 février 2007, 11:45

\input juste une partie d'un fichier

Message par touhami »

Bon jour.
Je vous propose ce petit code inspiré de http://tex.stackexchange.com/questions/ ... -of-a-file
à tester et améliorer, ça peut servir.
fichier maître

Code : Tout sélectionner

\documentclass[a4paper]{article}
%--------------------------------------------------------
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
%--------------------------------------------------------
\usepackage{amsmath,amssymb}
%--------------------------------------------------------
\usepackage[frenchb]{babel}
%--------------------------------------------------------
\newread\mtread
\newcounter{mtlineno}
\newcounter{dmtlineno}
\newcounter{fmtlineno}
\newcommand{\mtput}{}
\newcommand*{\mtinput}[3]{%           % input de text-début à text-fin
  \IfFileExists{#1}{%
    \immediate\openin\mtread #1
    \def\mtmt{#2}
    \setcounter{mtlineno}{0}
    \setcounter{dmtlineno}{0}
    \setcounter{fmtlineno}{0}
    {\endlinechar=-1
    \mtserch{dmtlineno}{\value{mtlineno}}
    \def\mtmt{#3}
    \mtserch{fmtlineno}{\value{mtlineno}}
    \immediate\closein\mtread}
    \partialinput{#1}{\value{dmtlineno}}{\value{fmtlineno}}%
    }{%
    \errmessage{File `#1' doesn't exist!}%
  }%
}
\makeatletter
\newcommand*{\partialinput}[3]{%    % input de ligne-i à ligne-j     
  \IfFileExists{#1}{%
    \immediate\openin\mtread #1
    \setcounter{mtlineno}{1}
    \@whilenum\value{mtlineno}<#2 \do{%
     \mttread%
    }
    \addtocounter{mtlineno}{-1}
    \let\mtput\empty
    \begingroup
    \endlinechar\newlinechar
    \@whilenum\value{mtlineno}<#3 \do{%
      \readline\mtread to\mtline
      \edef\mtput{\mtput\mtline}%
      \stepcounter{mtlineno}%
    }
    \immediate\closein\mtread
    \expandafter\endgroup
    \scantokens\expandafter{\mtput}%
  }{%
    \errmessage{File `#1' doesn't exist!}%
  }%
}
\makeatother
%                      des raccourcis
\newcommand*{\mtserch}[2]{%
\loop
\mttread%
\ifx\mtline\mtmt\setcounter{#1}{#2}\fi 
\ifnum\value{#1}=0
\repeat}
\newcommand*{\mttread}{%
\immediate\read\mtread to\mtline
\stepcounter{mtlineno}}
%--------------------------------------------------------         
\newcommand{\bla}{bla bla bla bla bla bla}
\newcommand{\bbla}{\bla\ \bla\ \bla\ \bla\ }
\newcommand{\Bla}{\bbla\ \bbla\ \bbla \par}
%--------------------------------------------------------
\begin{document}

test 

% exemple 1
\partialinput{myfile}{11}{15}
\partialinput{myfile}{4}{6} 

% exemple 2
\mtinput{myfile}{\begin{itemize}}{\Bla \Bla ici}  

\end{document}
fichier à input :myfile.tex

Code : Tout sélectionner

\section{Introduction}
\Bla \Bla \Bla
\Bla 
\begin{center}
text centré
\end{center}

\Bla \Bla
\[x+y=\ell\]

\begin{itemize}
\item Mathematex
\item \TeX
\item et \LaTeX
\end{itemize}

\section{Deux}
\Bla \Bla ici

\textbf{text en gras}
Merci d’avance.

touhami
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 433
Inscription : dimanche 11 février 2007, 11:45

Re: \input juste une partie d'un fichier

Message par touhami »

Bonjour à tous.
Pas de commentaire ?!
J'aimerais avoir votre avis s'il vous plait :
  • Est-ce que il y a des cas où ça marche pas ?
  • Peut-on l'améliorer ?
  • Est-ce que c'est inutile ?
Merci

raphkebab
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 227
Inscription : mardi 31 décembre 2013, 12:37
Localisation : Caen

Re: \input juste une partie d'un fichier

Message par raphkebab »

Je n'aime pas trop le principe, car si ton fichier "myfile" n'est pas dans sa version définitive aucun changement ne se fera automatiquement. Tu risques donc de te retrouver avec un max de bouleau si tu ajoutes ou interverties dans paragraphes.

touhami
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 433
Inscription : dimanche 11 février 2007, 11:45

Re: \input juste une partie d'un fichier

Message par touhami »

Merci bien raphkebab.
Le put principale est (de généraliser la commande \input) on peut donc input (juste) la partie qu'on veut.
Par exemple, de ligne 4 à 85 ou bien le contenue d'une section quelconque.
Intervertir des paragraphes est aussi une fonctionnalité.
Un autre exemple d'utilisation est lorsque \input un fichier de macros qui viennent d'ici et de la.
Merci pour l’intervention.

raphkebab
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 227
Inscription : mardi 31 décembre 2013, 12:37
Localisation : Caen

Re: \input juste une partie d'un fichier

Message par raphkebab »

Ce que je veux dire c'est que si je rajoute une ligne dans "myfile". Il faut vérifier toutes les commandes qui vont chercher du texte de la ligne n à m. Si je ne fais pas attention je peux insérer dans ma ligne une expression de début on de fin de citation. Si j'intervertis le dernier paragraphe que je veux cité et l'avant dernier il va me supprimer un paragraphe.

Le point faible de ce système est que rien dans le fichier "myfile" ne m'indique que je suis en train de faire une connerie quand je le modifie. Un système de labels est plus voyant.

touhami
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 433
Inscription : dimanche 11 février 2007, 11:45

Re: \input juste une partie d'un fichier

Message par touhami »

Oui, une bonne remarque. Merci.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: \input juste une partie d'un fichier

Message par marco56 »

Pour ma part, j'aime autant scinder les fichiers au départ ou en cours de route. Cela me semble bien compliqué pour pas beaucoup d'utilité. Ce n'est bien sûr que mon avis...

touhami
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 433
Inscription : dimanche 11 février 2007, 11:45

Re: \input juste une partie d'un fichier

Message par touhami »

Merci marco56 pour l’intervention.