2009-05-06 8 views
4

J'essaie de désactiver marginpar lors du démarrage d'un nouvel environnement multicols avec ce nouvel environnement, qui utilise les multicols et forfaits chngpage:largeur d'en-tête sur la dernière page du chapitre

\newenvironment{multi}[1]{% 
\newlength{\newtextwidth}% 
\setlength{\newtextwidth}{\marginparwidth}% 
\addtolength{\newtextwidth}{-1cm}% 
\addtolength{\headheight}{.5cm}% 
\let\oldheadrule\headrule% 
\addtolength{\headwidth}{\newtextwidth}% 
\begin{adjustwidth}{}{-\newtextwidth}\begin{multicols}{#1}}% 
{\end{multicols}\end{adjustwidth}} 

Ce qui fonctionne très bien: latex header http://img6.imageshack.us/img6/6757/screenshotewa.png

Uhm, presque, depuis la dernière page du chapitre en cours "Lorem ipsum" il se comporte comme si je ne l'avais pas demander à: \ addtolength {\ headwidth} {\ newtextwidth}: latex header at the end of the chapter http://img11.imageshack.us/img11/6072/screenshotwbd.png

Comment pourrais-je résoudre ce problème?

Modifier:

J'utilise aussi fancyhdr.

2ème Edition:

A PoC:

\documentclass[12pt,a4paper,oneside]{report} 
\usepackage[utf8]{inputenc} 
\usepackage[top=2cm,left=2cm,right=4.5cm]{geometry} 
\usepackage{chngpage} 
\usepackage{color} 
\usepackage{amsmath} 
\usepackage[pdftex,bookmarks,pdfpagemode=UseOutlines,bookmarksopen,backref 
,colorlinks,urlcolor=blue,linktocpage]{hyperref} 
\usepackage{url} 
\usepackage{amssymb} 
\usepackage{lipsum} 
\usepackage{fancyhdr} 
\usepackage{multicol} 
\usepackage{indentfirst} 
\usepackage{listings} 
\usepackage{boxedminipage} 
\pagestyle{fancy} 

\setlength{\columnseprule}{1pt} 

\setlength{\marginparwidth}{4cm} 

\rhead{\large\leftmark} 
\renewcommand{\chaptermark}[1]{% 
    \markboth{#1}{}} 

\makeatletter 
\renewcommand*\@makechapterhead[1]{% 
    {\parindent \[email protected] \raggedright \normalfont 
    \huge\bfseries 
    #1\par\nobreak 
    \vskip 20\[email protected] 
    }} 
\makeatother 

\let\oldmarginpar\marginpar 
\renewcommand\marginpar[1]{\-\oldmarginpar[\sffamily\raggedleft\footnotesize #1]% 
{\sffamily\raggedright\footnotesize 
\begin{boxedminipage}{\marginparwidth}#1\end{boxedminipage} 
}} 




\newenvironment{multi}[1]{% 
\newlength{\newtextwidth}% 
\setlength{\newtextwidth}{\marginparwidth}% 
\addtolength{\newtextwidth}{-1cm}% 
\addtolength{\headheight}{.5cm}% 
\let\oldheadrule\headrule% 
\addtolength{\headwidth}{\newtextwidth}% 
\begin{adjustwidth}{}{-\newtextwidth}\begin{multicols}{#1}}% 
{\end{multicols}\end{adjustwidth}} 


\begin{document} 
\tableofcontents 

\chapter{Lorem ipsum} 
\begin{multi}{2} 
\lipsum[1-20] 
\end{multi} 

\chapter{Lorem ipsum} 
\begin{multi}{2} 
\lipsum[1-20] 
\end{multi} 

\chapter{Lorem ipsum} 
\begin{multi}{2} 
\lipsum[1-20] 
\end{multi} 


\end{document} 

Il devrait être possible de poursuivre une seule colonne sur la même page, après "multi", mais les en-têtes doivent être conservés comme quand la page a été démarrée dans l'environnement "multi". Pourquoi aurais-je besoin d'une seule colonne après plusieurs colonnes sur la même page avec un marginpar? Imaginez présenter le code source de l'article, avec de petits indices en marge.

+0

Il peut être utile de montrer un exemple complet de LaTeX, y compris tous les paquets que vous utilisez - par ex. \ headwidth est défini dans fancyheadings, pas dans LaTeX de base. –

Répondre

7

Je suppose que votre dernière rubrique est en cours de construction après que votre texte a fini de créer les boîtes multicol, vous êtes donc hors de portée de votre changement. Cela revient à l'ancienne valeur.

Vous feriez probablement bien d'ajouter le paquet fancyhdr et l'utiliser. Je crois qu'il se comporte bien en multicolonne.

D'accord, donc c'est presque certainement la chose de la portée. Vous faites l'adjustwidth dans votre nouvel environnement multi. Lorsque votre texte est épuisé dans l'environnement multiple, vous n'avez pas rempli la dernière page; les en-têtes ne sont pas configurés tant que la page n'est pas remplie. Donc votre environnement mutlti termine la boîte, vous laissez la portée, et ALORS la page est finie et émise. En utilisant l'ancienne largeur.

Définissez la largeur de l'en-tête et les paramètres en dehors de l'environnement.

+0

C'est sûrement la bonne explication. Si vous ne voulez pas utiliser fancyhdr, vous pouvez essayer un \ clearpage à la fin du texte.Cela pourrait sembler faux. – dmckee

+0

L'exemple que j'ai exposé utilise déjà fancyhdr. Désolé de manquer pour le signaler. – Flavius

+0

Encore une fois, j'aimerais savoir ce que le downvote était pour .... –

5

J'ai exécuté votre document de test. Il semble y avoir un bug en ce que \newlength{\newtextwidth} a un effet global, et provoque donc une erreur. Je ne sais pas pourquoi, mais je l'ai sorti du \newenvironment{multi} sans aucun effet néfaste.

Le diagnostic de Charlie est définitivement correct. Une autre solution consiste à mettre fin à la page après les multicols, mais avant le adjustwidth, ainsi:

\newenvironment{multi}[1]{% 
    ...} 
{\end{multicols}\vfill\break\end{adjustwidth}} 

J'ai testé cette solution et sur votre document d'exemple, il produit un bon rendement.

+0

seconde que je ; changer la largeur de l'en-tête de l'intérieur d'un environnement ne devrait pas fonctionner; qu'est-ce que TeX est supposé faire quand vous avez deux environnements sur une seule page qui ne peuvent pas être d'accord sur la largeur? En outre, lors de la réorganisation du contenu pour remplir les pages parfaitement, un environnement pourrait se retrouver sur une page différente et lorsque l'en-tête. –

Questions connexes