Dans Microsoft Word, il existe deux manières d'afficher des équations. En ligne et Afficher . Une équation en ligne est en ligne avec le texte (comme son nom l'indique), de sorte que les équations et le texte peuvent être mélangés. Une équation à afficher apparaît sur sa propre ligne et est automatiquement centrée, comme suit:
Ce sont trois équations distinctes, mais comme elles sont configurées en mode d'affichage, elles apparaissent toutes centrées et sur leur propre ligne. Si leur mode est modifié en ligne, ils apparaissent tous sur la même ligne et non centrés à la place:
Mon problème est que LibreOffice montre toutes les équations en mode inline, même si elles sont définies en mode display dans le fichier docx. Si je crée le premier exemple à l'aide d'équations en mode d'affichage Word, le sauvegarde et l'ouvre ensuite dans LibreOffice, les équations apparaissent comme si elles étaient en mode en ligne:
Existe-t-il un paramètre que je puisse modifier pour que les équations en mode d'affichage soient sur leurs propres lignes et centrées, comme dans Word? En raison de la quantité de documents Word dont je dispose, je préférerais ne pas modifier les documents individuellement.
Sinon, existe-t-il un autre traitement de texte affichant correctement les équations?
Lorsqu'une formule est insérée dans LibreOffice, elle est ancrée As Character
par défaut.
Cela signifie qu'il se comporte comme les personnages. Nous traitons donc la même chose comme si nous avions trois caractères, par exemple "abc" au lieu de trois équations.
Maintenant, les trois équations sont centrées et sur des lignes séparées.
Voici le résultat de ces instructions pour l'exemple "abc", montrant que les formules se comportent comme des caractères. (Pressage Enter corrigé automatiquement en majuscule "A").
Pour que cela fonctionne à la fois dans MS Word et LibreOffice, utilisez peut-être uniquement le paramètre Inline . Cependant, je n'ai pas de copie de MS Word pour le vérifier et Word Online ne peut pas modifier les formules (mais peut les afficher si c'est tout ce dont vous avez besoin).
Existe-t-il un autre traitement de texte utilisant le paramètre de formule Afficher comme le fait MS Word? Très probablement; il existe un certain nombre d'alternatives, payantes ou gratuites. Quelle que soit l'alternative que vous choisissiez, il y aura des incompatibilités.
J'ai accepté qu'il était peu probable qu'un traitement de texte offrant cette fonctionnalité sous Linux existe. J'ai donc décidé d'automatiser la réponse de Jim K en créant un script Ruby.
L’origine du problème est que LibreOffice ignore l’élément XML m:oMathPara
, qui correspond également à ce que Word encapsule une équation en mode affichage pour la centrer et la placer sur son propre paragraphe.
Le script Ruby ci-dessous utilise la bibliothèque d’analyse XML Nokogiri pour remplacer toutes les occurrences de m:oMathPara
par des paragraphes standard w:p
, qui sont également formatés pour être centrés. Il fait ce qui suit:
/tmp
, le décompresse et ouvre document.xml
.m:oMathPara
w:p
formatés/tmp
Cela n'a pas été beaucoup testé, vous devriez donc sauvegarder tous les fichiers sur lesquels vous l'utilisez, au cas où. Notez qu'il ne fonctionnera que sous Linux et nécessite l'installation de l'outil unzip
. (C'est sur l'univers si vous ne l'avez pas: Sudo apt install unzip
.) Vous devrez peut-être aussi gem install nokogiri
.
#!/usr/bin/Ruby
# THIS IS LINUX ONLY!
# You'll also need to install `unzip`:
# Sudo apt install unzip
require "pp"
require "Zip"
require "fileutils"
require "nokogiri"
def error(msg)
puts msg
exit
end
temp_dir = "/tmp/dispeqfix/"
filename = ARGV[0]
error "Please pass a filename as an argument." if filename.nil?
# Remove the directory if this tool has been run before
FileUtils.remove_dir(temp_dir) if Dir.exist? temp_dir
# Extract file as a Zip
%x{unzip '#{filename}' -d '#{temp_dir}'}
# Get path to document.xml, the file we need to modify
document_path = "/tmp/dispeqfix/Word/document.xml"
error "document.xml not found - are you sure this file is a DOCX?" unless File.exist? document_path
xml = Nokogiri::XML(File.read(document_path))
# 'm:oMathPara' is the element which LibreOffice doesn't support
xml.search("//m:oMathPara").each do |math_para|
# Get the paragraph containing this one
parent_para = math_para.parent
# Get the 'm:oMath' contained within the 'm:oMathPara'
math_para.dup.children.each do |math|
# Insert a new paragraph with contains the 'm:oMath'
new_para = Nokogiri::XML::Node.new("w:p", xml)
math.parent = new_para
parent_para.after(new_para)
# Centre the paragraph
math.before("<w:pPr><w:jc w:val=\"center\"/><w:rPr/></w:pPr><w:r><w:rPr/></w:r>")
end
math_para.remove
end
# Write this temporary file
File.write(document_path, xml.to_xml)
# Re-Zip and open it
%x{ cd /tmp/dispeqfix; Zip -r ../dispeqfix.docx * }
preview = spawn("libreoffice --writer /tmp/dispeqfix.docx 2>&1 > /dev/null", out: File::NULL)
Process.detach(preview)
# Prompt for overwrite
print "Would you like to overwrite the original document with this one? [y/n] "
if $stdin.gets.chomp == "y"
%x{ cp -f /tmp/dispeqfix.docx #{filename} }
puts "Overwritten."
else
puts "No change made."
end