XML Hacking: Fix Broken PowerPoint Links

Someone sends you a presentation linked to an Excel file. The links don’t work and you can’t fix them without redoing them. Here’s how to fix broken PowerPoint links with a one minute of XML Hacking.

This article is really just for PowerPoint for Mac users. If you have the Windows version, you can fix broken Excel or Word links by choosing File>Info, then clicking on Edit Links to Files in the right-hand column under Related Documents. (Please note, the Edit Links option only appears if you actually have a link in the open presentation.) Word and Excel already have utilities to fix links.

If you haven’t hacked XML before, please read XML Hacking: An Introduction and XML Hacking: Editing in macOS. This article mentions Excel, which I’ve used as an example, but the same advice is true for Word files linked to PowerPoint. Links to other formats, like PDF, are simply not supported on macOS.

In Office, links to documents include the complete path. Of course, when you move those linked files to a new computer, the path is always different, so the links must be corrected. The symptoms of a broken link depends on the type of link that was created. If the file creator selected a workbook section or chart, then used Paste Special to paste in a link, you’ll see this message when you double-click on the Excel excerpt:

Fix Broken PowerPoint Links - Paste Special

But the creator may have used Insert>Object instead, and chosen to link rather than embed the file. Then you’ll see this when you try to edit:

Fix Broken PowerPoint Links - Inserted Object

Then after dismissing that dialog, you’ll see the first one about the server error.


Fix Broken PowerPoint Links – The Steps

The issue is that a path is embedded in the PowerPoint file, and that path must be edited. Open the file in BBEdit.

The XML we need to change is associated with the slide(s) on which the Excel item is placed. So lets look. In the left-hand window, click on ppt. Then select slides then the _rels folder. Rels is short for relationships, and it’s the mechanism in every OOXML folder that tells PowerPoint where to find the objects in use.

The _rels folder has a .rels file for each slide in the presentation. Open the file for the slide containing the linked Excel. If the link was inserted using Paste Special, it will look like this (Pay attention to the third line and scroll all the way to the right. The path to be edited is in bold):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="file:///\\192.168.1.250\Dockets\Test\Excel\Link2PowerPoint.xlsx!Sheet1!R1C1:R1C4" TargetMode="External"/>
  <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout7.xml"/>
  <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing" Target="../drawings/vmlDrawing1.vml"/>
  <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="../media/image1.emf"/>
</Relationships>

If the Excel file has been inserted as an linked object, it won’t include a range of cells, just the workbook name:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
  <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="file:///\\192.168.1.250\Dockets\Test\Excel\Link2PowerPoint.xlsx" TargetMode="External"/>
  <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout7.xml"/>
  <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing" Target="../drawings/vmlDrawing2.vml"/>
  <Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="../media/image2.emf"/>
</Relationships>

Since the Excel item was inserted on a Windows computer, the path uses backslashes instead of forward slashes. There are two path syntaxes that are acceptable. If both the file linked to and the presentation containing the link are in your User folder, you can use a relative path and the linked file will open up immediately. If the file linked to is on a network share or somewhere on your disk outside your user folder, you will have to use an absolute path and you will get a challenge from Office when you open the link.

Let’s do the relative path first. In this example, the Excel file is in my user Documents folder and the PowerPoint is in my user Downloads folder. So I edit:

Target="file:///\\192.168.1.250\Dockets\Test\Excel\Link2PowerPoint.xlsx"

to:

Target="file:///../Documents/Test/Excel/Link2PowerPoint.xlsx"

In Unix/DOS speak, the 2 dots mean “go up one level”, out of the Downloads folder where the presentation is into the main user folder. Then the slashes lead you down into the Documents folder and subfolders to the Excel location. Once you set a relative path, you must leave the PowerPoint file in the same folder. Moving it will break the path.


Fix Broken PowerPoint Links – The Best Relative Path

For a linked file that you know will be moved from desktop to desktop, the best strategy is to place both files in the same folder. Then use this path:

Target="file:///Link2PowerPoint.xlsx"

Now even if you shuffle it between Mac and Windows, the linked Excel file will open as expected without having to edit the links at all!


Fix Broken PowerPoint Links – Absolute Paths

If the file to be linked to is on another disk, use an absolute path. With an absolute path, you can move the PowerPoint file anywhere on your computer or to other machines and it will still be able to find the linked file. Here’s what an absolute path looks like:

Target="file:///Volumes/TheNameOfYourHardDisk/Users/YourUserName/Documents/Test/Excel/Link2PowerPoint.xlsx"

Important! A macOS absolute path must begin with Volumes, followed by a slash and the name of the disk. If your network is set up for different operating systems, you’ll probably use an IP address instead, as shown in the original file path. Consult with your IT department.

Office 2016 for Mac applications are sandboxed applications, so when you first open an Office file linked with an absolute path, you’ll see a warning:


Fix Broken PowerPoint Links - Absolute Path Warning 1

Click on Select…, then you’ll see:

Fix Broken PowerPoint Links - Absolute Path Warning 1

Select the correct file if it isn’t already selected, then click on Grant Access. Now double-click on the linked Excel item to edit and you’ll see this again:

Fix Broken PowerPoint Links - Edit Warning

OK, that’s something of a hassle, but the good thing is that you won’t see those warnings again as long as the linked file says in the same place with the same name. You also only get warned once per placed file, even if there are multiple uses of that file in your presentation.

Linked files are a huge benefit when you have a data source that is constantly being updated. Using them means your presentation can always be up to date. Now that you know how to fix the links, you have a very useful new tool.

XML Hacking – Add a Table of Contents to the TOC Gallery

In Word for Windows, you can select a Table of Contents and then add it to the TOC Gallery using References>Table of Contents>Save Selection to Table of Contents Gallery (highlighted in red below):

Add a Table of Contents to the TOC Gallery

Unfortunately, Mac versions of Word do not share this feature. But it’s a super-simple hack. If you are new to XML editing, please read XML Hacking: An Introduction. MacOS users should also read XML Hacking: Editing in macOS to avoid a couple of Mac-specific XML issues. The latter article now mentions the free XML editing plugin for the Chrome browser in the July 2018 update.


Add a Table of Contents to the TOC Gallery – The Steps

Make sure you’re working on a template rather than a document. We’ll be using AutoText, and AutoText is saved to the template. If you’re working on a document, the AutoText would get saved to the template attached to the document, not the document itself.

  • Start by making the invisible characters visible, using Word>Preferences…>View and checking All in the Show Non-Printing Characters section.
  • Now select the custom Table of Contents, making sure to include the paragraph mark just below it.
  • Choose Insert>AutoText>AutoText….
  • Set the Look in: dropdown to the name of the template you’re working on.
  • In the Enter AutoText entries here: field, give the AutoText entry a sensible name like Clientname Custom TOC.
  • Click on the Add button and save the template. Close Word.
  • Open the template file in your text editor or Chrom browser with the OOXML plugin.
  • Navigate to word/glossary and open document.xml, the home of all AutoText.
  • Search for the name you gave the TOC AutoText entry. The first few lines should look something like this:
  <w:docParts>
    <w:docPart>
      <w:docPartPr>
        <w:name w:val="Brandwares Custom TOC"/>
        <w:style w:val="TOC 2"/>
        <w:category>
          <w:name w:val="General"/>
          <w:gallery w:val="docParts"/>
        </w:category>
        <w:behaviors>
          <w:behavior w:val="content"/>
        </w:behaviors>
        <w:guid w:val="{DBD01F60-383F-C040-9417-745701ADCDFD}"/>
      </w:docPartPr>
  • Make 2 changes in the <w:category> section:
    1. Change the w:name value from General to a more meaningful name like Custom TOC. This will display as the heading under which your custom TOC appears.
    2. Change the w:gallery value from docParts to tblOfContents. This is the crucial step that makes the TOC appear in the TOC Gallery.
  <w:docParts>
    <w:docPart>
      <w:docPartPr>
        <w:name w:val="Brandwares Custom TOC"/>
        <w:style w:val="TOC 2"/>
        <w:category>
          <w:name w:val="Custom TOC"/>
          <w:gallery w:val="tblOfContents"/>
        </w:category>
        <w:behaviors>
          <w:behavior w:val="content"/>
        </w:behaviors>
        <w:guid w:val="{DBD01F60-383F-C040-9417-745701ADCDFD}"/>
      </w:docPartPr>
  • Resave the template file, close the editor and open it in Word.
  • Choose References>Table of Contents, scroll down to the Custom TOC section and choose your custom TOC.

Final Custom TOC in TOC Gallery


Add a Cover to the Cover Gallery

You can use exactly the same steps to add a custom cover to the Cover Gallery. Just change the w:category w:name value to Custom Covers and the w:gallery value to coverPg.

XML Hacking: Repairing Color Themes

Last time, I wrote about how to make great color themes. But what about if you (or your client) have discovered that an existing color theme has a problem. If you catch them early, most issues with color themes can be corrected using PowerPoint’s user interface. Say you’ve created a theme or template, but some of the tests in the last article show problems. Repairing color themes requires rearranging the theme colors, then recoloring any graphic elements on the Slide Master and Slide Layouts.

If you didn’t test the template or theme and you’ve already created a presentation before finding the theme problem, it’s more work to fix. Follow the same sequence: rearrange the colors in the theme, fix the Slide Master, then the Layouts and finally repair any element on each slide that still needs help.

But what about if there are multiple templates, or several decks that have been created from a faulty theme? Repairing color theme problems manually quickly becomes an ordeal. It’s time-consuming and error-prone to try to make all the changes by hand. Searching and Replacing using a text editor would be much quicker and more thorough. It’s time to hack some XML!


Repairing Color Themes – The Theme

If you haven’t editing XML directly before, please read XML Hacking: An Introduction. MacOS users should also read XML Hacking: Editing in macOS to avoid a couple of Mac-specific XML issues.

We’re going to fix all the color theme problems by searching for XML text and replacing it with corrected values. Professional test editors really shine for this kind of work because of their abilities to do search and replace on multiple folders full of files, saving you hours of work. NotePad++ for Windows and BBEdit for macOS are 2 excellent choices for this work, they both have multi-file search and replace.

If you’re using Windows, unzip the files in a separate folder. On a Mac, open the theme or template in BBEdit.

Start by correcting the color order of the theme file located in ppt\theme\theme1.xml. During design, you may have applied more than one theme and PowerPoint hoards them all. If you have more than one theme file, check the name attribute to ensure you’re changing the one actually used in your deck. (If the theme is called Office Theme, that’s a Microsoft default, you don’t have to update it.) You may also have more than one theme if your presentation contains more than one slide master. Here are before and after examples, showing only the first 4 colors:

Before: Theme1.xml
<a:clrScheme name="Broken">
  <a:dk1>
    <a:srgbClr val="333333"/>
  </a:dk1>
  <a:lt1>
    <a:srgbClr val="518CA3"/>
  </a:lt1>
  <a:dk2>
    <a:srgbClr val="FFFFFF"/>
  </a:dk2>
  <a:lt2>
    <a:srgbClr val="E4E4E4"/>
  </a:lt2>

This has blue in the lt1 (Light 1) slot and white in the dk2 (Dark 2) spot. One symptom is inserted SmartArt that shows blue text instead of the expected white.

Before: SmartArt Appearance
Repairing Color Themes - Before
After: Theme1.xml
<a:clrScheme name="Repaired">
  <a:dk1>
    <a:srgbClr val="333333"/>
  </a:dk1>
  <a:lt1>
    <a:srgbClr val="FFFFFF"/>
  </a:lt1>
  <a:dk2>
    <a:srgbClr val="518CA3"/>
  </a:dk2>
  <a:lt2>
    <a:srgbClr val="E4E4E4"/>
  </a:lt2>

If a presentation uses Chart Templates, you may also see files in the Theme folder like themeOveride1.xml. This override component allows a chart template to have a color theme different from the presentation into which it’s placed. All chart templates created from a template contain this themeOverride component, which is simply a copy of the main color theme. If the template color theme is bad, then you’ll also have to open all the chart templates and update chart/theme/themeOverride1.xml.


Repairing Color Themes – The Slide Master

For our simple example, we can skip this step, but for more complex repairs, it may also be necessary to adjust the color map in the slide master. If the presentation was based on a color theme exported from Word or Excel, this is necessary. It’s also often needed for legacy decks that have been imported from PowerPoint 2003 and earlier.

The Slide Master has 2 parts. First is the slide formatting that displays in the Slide Master view of PowerPoint. It’s tagged with <p:cSld>. Immediately after that are parameter storage sections holding references to the slide layouts, title, body and other text formatting, etc. The very first section <p:clrMap is what we’re looking for. The full default color map looks like this:

<p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/>

Compare this to a color map when a Word color theme is imported to PowerPoint:

<p:clrMap bg1="dk1" tx1="lt1" bg2="dk2" tx2="lt2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/>

You can see that the dark colors dk1 and dk2 are mapped to the background instead of the text, while text is formatted with lt1 and lt2. The color theme hasn’t been altered, just the way it is mapped to the presentation elements. There is nothing in the program interface to fix this, you must edit the XML. Mental organization becomes very important when changing both the theme and the color map, you can easily get confused.


Repairing Color Themes – Search and Replace

The above steps are preparatory to making the actual changes. Now we need to change the color tags attached to all affected elements in the Slide Master(s) and all Slide Layouts and Slides. Let’s use the example of switching the blue and white. The blue was in the lt1 slot, which is mapped in the Slide Master to bk1 by default. The white was in the dk2, mapped to tx2. After switching the color order, we need to change all bk1 color tags to tx2 and all tx2 tags to bk1.

Wherever a tag is used as an attribute, it has straight quotes before and after. Include these in your search terms so you don’t mess up the color map in the Slide Master. It’s simplest to run this on all files in the archive:

Find what: “bk1” – Replace with: “tx22”

Find what: “tx2” – Replace with: “bk1”

Find what: “tx22” – Replace with: “tx2”

That should do it! Zip up the files with the same file ending as the original, if you’re using Windows. On the Mac, just save the file. Test in PowerPoint.

After: SmartArt Appearance
Repairing Color Themes - After

This is the simplest repair scenario. Sometimes you have to move more colors around, particularly if the creator was someone unfamiliar with PowerPoint. Make notes ahead of time, to make sure you’ve got the right colors moving to the right slots. And always work on a copy of the file, not the original! If it gets too complicated, just send it to us, we do this kind of thing all the time.

Next time, I’ll be discussing PowerPoint SuperThemes. Brandwares has cracked the construction of these, so I’ll cover what you need to know.

XML Hacking: Recent Colors

Recent colors are handled inconsistently by Microsoft Office programs. Word and Outlook only retain recently used colors only as long as the program is running, and those colors are visible in every document that’s open. By contrast, PowerPoint and Excel both include them in the document. As soon as you open a different file, the previous colors disappear from the color picker. Return to the first document and there they are again.

If you’re creating files for clients, you may generate quite a few colors in the design process. Your work will look a little more professional if you purge the Recent Colors from the PowerPoint or Excel file before sending it on.

If you’re new to XML hacking, please read my intro: XML Hacking: An Introduction. If you’re working on a Mac, you should also read XML Hacking – Editing in macOS.

Recent Colors in the Windows Color Picker

The row of Recent Colors that PowerPoint and Excel include in the file is a distraction for your client.


Recent Colors Removal Steps

Under Windows, begin by unzipping the file. On a Mac, open it in BBEdit or other advanced text editor.

If this is a PowerPoint deck, look in the ppt folder for the presProps.xml file. The recent colors begin on the third line of a prettified (human-readable) file. Simply delete the entire clrMru section:

<p:clrMru>
  <a:srgbClr val="A54DA5"/>
  <a:srgbClr val="C8006E"/>
  <a:srgbClr val="64006E"/>
</p:clrMru>

To remove the Recent Colors from an Excel workbook, open the xl folder, then edit styles.xml. Look for the colors section, then delete the entire mruColors part:

<colors>
  <mruColors>
    <color rgb="FF640064"/>
    <color rgb="FF393939"/>
  </mruColors>
</colors>

After editing, rezip the files if you’re using Windows or save and close in your macOS text editor. Test that the file opens as expected and no longer has Recent Colors in the color picker, that send it off to the client.

Recent Colors Removed

A more presentable dialog for your client.


Don’t Reuse Recent Colors

Occasionally an artist will try to include special colors in the Recent Colors section, to give the client some additional color choices. This is a bad idea because the Recent Color section is dynamic. When any new color is created, it’s added to the left end of Recent Colors. If the row is full, the oldest color gets pushed off the right end. A better solution is to create Custom Colors. Here’s my how-to on the subject. Custom Colors don’t move or change and can be named, which is a little extra help for your client.

XML Hacking: Font Themes Complete

I wrote about how to create a basic font theme in 2015: XML Hacking: Font Themes. Thanks to everyone for the comments and feedback that have allowed me to refine the article and make it more helpful.

That article covered a bare bones font theme for European languages (referred to as Latin fonts in Microsoft-speak). International and multilingual users require a theme that can work with a greater variety of languages and fonts, so in this article I’m going to cover how these work and how to create them.


A More Complete Simple Theme

There’s more we can do with the very basic theme from the previous article. In the listing below, a font has been specced for only Latin fonts.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a:fontScheme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Test">
  <a:majorFont>
    <a:latin typeface="Arial"/>
    <a:ea typeface=""/>
    <a:cs typeface=""/>
  </a:majorFont>
  <a:minorFont>
    <a:latin typeface="Arial"/>
    <a:ea typeface=""/>
    <a:cs typeface=""/>
  </a:minorFont>
</a:fontScheme>

In both the Major (Headings) and Minor (Body) categories, there are also ea (East Asian) and cs (Complex Scripts) entries. These theme entries are inactive until text is formatted as a relevant language. As long as your text is marked as US English (either by using the Review>Language>Set Proofing Language, or by setting the language in a Style), only the Latin theme fonts will be active. But if you mark text as Chinese, the Office program will check the theme and use the font in the ea tag instead. Likewise, Persian text will activate the cs theme font.

What will not work is to try to set an East Asian or Complex Scripts font in the Latin tag. Depending on the version and platform of Office, you’ll only get European characters showing, or the program will completely ignore your theme. Here’s a simple font theme that will work with Japanese, Arabic and European languages:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a:fontScheme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Test">
  <a:majorFont>
    <a:latin typeface="Arial"/>
    <a:ea typeface="Meiryo"/>
    <a:cs typeface="Andalus"/>
  </a:majorFont>
  <a:minorFont>
    <a:latin typeface="Arial"/>
    <a:ea typeface="Meiryo"/>
    <a:cs typeface="Andalus"/>
  </a:minorFont>
</a:fontScheme>

Depending on which ea or cs font you choose, it may support one or several languages. As an example, CJK fonts will support Chinese, Japanese and Korean. Of course, in a collaboration scenario, the fonts chosen should be available on both Mac and Windows, or the display of one of the langauges may get mangled with a font substitution. The best idea is to stick with fonts distributed by Microsoft with Office.


Complex Font Themes

When you crack open the XML on a document or theme, the font theme information is contained in theme/theme1.xml. This illustrates a font theme that is ready to take on the world:

<a:fontScheme name="Office Theme">
  <a:majorFont>
    <a:latin typeface="Calibri Light" panose="020F0302020204030204"/>
    <a:ea typeface=""/>
    <a:cs typeface=""/>
    <a:font script="Jpan" typeface="MS Pゴシック"/>
    <a:font script="Hang" typeface="맑은 고딕"/>
    <a:font script="Hans" typeface="宋体"/>
    <a:font script="Hant" typeface="新細明體"/>
    <a:font script="Arab" typeface="Times New Roman"/>
    <a:font script="Hebr" typeface="Times New Roman"/>
    <a:font script="Thai" typeface="Angsana New"/>
    <a:font script="Ethi" typeface="Nyala"/>
    <a:font script="Beng" typeface="Vrinda"/>
    <a:font script="Gujr" typeface="Shruti"/>
    <a:font script="Khmr" typeface="MoolBoran"/>
    <a:font script="Knda" typeface="Tunga"/>
    <a:font script="Guru" typeface="Raavi"/>
    <a:font script="Cans" typeface="Euphemia"/>
    <a:font script="Cher" typeface="Plantagenet Cherokee"/>
    <a:font script="Yiii" typeface="Microsoft Yi Baiti"/>
    <a:font script="Tibt" typeface="Microsoft Himalaya"/>
    <a:font script="Thaa" typeface="MV Boli"/>
    <a:font script="Deva" typeface="Mangal"/>
    <a:font script="Telu" typeface="Gautami"/>
    <a:font script="Taml" typeface="Latha"/>
    <a:font script="Syrc" typeface="Estrangelo Edessa"/>
    <a:font script="Orya" typeface="Kalinga"/>
    <a:font script="Mlym" typeface="Kartika"/>
    <a:font script="Laoo" typeface="DokChampa"/>
    <a:font script="Sinh" typeface="Iskoola Pota"/>
    <a:font script="Mong" typeface="Mongolian Baiti"/>
    <a:font script="Viet" typeface="Times New Roman"/>
    <a:font script="Uigh" typeface="Microsoft Uighur"/>
    <a:font script="Geor" typeface="Sylfaen"/>
  </a:majorFont>
</a:fontScheme>

For brevity, I’ve omitted the Minor font section. Instead of setting the ea and cs fonts, this font theme has entries for more tightly defined language groups and different fonts assigned to each one. This level is detail is necessary for a font theme that can be used around the world. Since I copied this listing from theme1.xml, it doesn’t have the XML opening that a standalone font theme would have.

Setting up and testing a complex font theme like this is not a simple task. The font switching is automatic and is triggered by the language input setting on your computer, the language set in your template styles and the language set in the text being edited. Please post your comments, let me know of any hiccups or problems you notice and I’ll try to answer your questions.

XML Hacking: Styled Text Boxes Complete

My last post began the subject of styled text boxes. There I covered the parameters contained in the first line of each level definition. Today’s entry continues by introducing the XML elements inside the level definition that format text. As a reminder, a level definition is the equivalent of a PowerPoint style. Since a text box can have up to 9 text levels, we can format 9 unique styles.


Styled Text Boxes – Enclosed Parameters

I’m using the phrase Enclosed Parameters to indicate elements that are within an a:lvl#pPr level definition, as opposed to the first line values covered in my last post. Here is a super simple level with only 2 enclosed parameters, shown in bold:

<a:lvl1pPr marL="0" indent="0">
  <a:buNone/>
  <a:defRPr sz="1400"/>
</a:lvl1pPr>

The first tag, a:buNone, sets the level to not have a bullet, while a:defRPr sets the text size to 14 points.

Next, here’s an example that shows line spacing and tab settings:

<a:lvl2pPr marL="0" indent="0">
  <a:lnSpc>
    <a:spcPct val="125000"/>
  </a:lnSpc>
  <a:spcBef>
    <a:spcPts val="1200"/>
  </a:spcBef>
  <a:spcAft>
    <a:spcPts val="500"/>
  </a:spcAft>
  <a:tabLst>
    <a:tab pos="457200" algn="l"/>
    <a:tab pos="914400" algn="l"/>
    <a:tab pos="1371600" algn="l"/>
  </a:tabLst>

In order, this block sets line spacing of 125% (or leading, for the designers), 12 points of space before and space after of 5 points. Finally, three left-aligned tabs are set. The units are EMUs, so these tabs are spaced 1/2″ apart.

Enclosed Parameters – Bullets

Out of 16 possible enclosed parameters, 11 are for bullet formatting. Creating bullets by editing XML is an exercise in frustration. It’s far easier to create bullets using the program interface and then transfer that XML to the p:defaultTextStyle section of presentation.xml.

For an overview of all level definition parameters, this page covers them: Datypic page for List Level Text Style


Styled Text Boxes – The Easy Way

Sure, you could do all of the above in a text editor, if you wanted to prove your coding prowess. But time is short and there’s a faster way to get this job done using PowerPoint’s program interface. This leverages the fact that the structure for list level text is exactly the same for p:titleStyle, p:bodyStyle and p:otherStyle as used in slideMaster1.xml, p:txBody, used in many slide layouts, and p:defaultTextStyle as seen in presentation.xml.

My preferred method is to start by making a copy of the Content with Caption slide layout, then deleting the title and content placeholder, leaving only a text placeholder preformatted with small text. Then I make 9 levels of text and format each to match a design or client specs for what the text box styles should look like. Do all your bullet formatting here. Save the file and exit PowerPoint.

Now expand the file and look in ppt/slideLayouts. The Content and Caption layout is usually slideLayout8.xml. If you duped it as suggested, open slideLayout9.xml and format the code to be humanly readable. Just below <a:lstStyle> are 9 level definitions with all the formatting you created in the program interface. Each level starts with <a:lvlXpPr where X is the level number. Copy all 9 level definitions, but not the starting <a:lstStyle> or closing </a:lstStyle> tags.

Now open ppt/presentation.xml, select all 9 level definitions (starting just below </a:defPPr>) and paste in the 9 levels from slideLayout9.xml. Save the file, zip everything back into a presentation. Each inserted text box should now have up 9 levels of styles that match the formatting you created on the duplicated layout. Delete the extra layout and you’re done.


Styled Text Boxes – What about the Font?

If you’ve tried these steps out, you might notice one glaring omission in the XML. When you format a slide layout and copy the XML, there is no font information in the level definitions. This is because the layout gets its font info from the slide master. There are 2 ways to fix this:

  • If all levels the text box are in the same font, open the presentation, create a text box, set the font, right-click on the text box and choose Set as Default Text Box.

This action fills an objectDefaults stub at the bottom of ppt/theme/theme1.xml. It looks something like this:

<a:objectDefaults>
  <a:txDef>
    <a:spPr>
      <a:noFill/>
    </a:spPr>
    <a:bodyPr wrap="square" rtlCol="0">
      <a:spAutoFit/>
    </a:bodyPr>
    <a:lstStyle>
      <a:defPPr>
        <a:defRPr dirty="0" smtClean="0">
          <a:latin typeface="+mn-lt"/>
        </a:defRPr>
      </a:defPPr>
    </a:lstStyle>
  </a:txDef>
</a:objectDefaults>

In this case typeface=”+mn-lt” sets the text box font to the Minor (hence mn) or Body theme font. The Heading theme font would appear as +mj-lt.

  • If there are different fonts for different levels, apply those fonts when formatting the duplicate slide layout.

Interesting fact: If a level is set by default to a theme font, clicking on the font dropdown and re-selecting the same theme font breaks the font inheritance from the slide master and specifies the theme font in the layout instead. Here’s the default XML from the layout level 1 again:

<a:lvl1pPr marL="0" indent="0">
  <a:buNone/>
  <a:defRPr sz="1400"/>
</a:lvl1pPr>

And here’s what it looks like after reapplying the theme font in the layout:

<a:lvl1pPr marL="0" indent="0">
  <a:buNone/>
  <a:defRPr sz="1400">
    <a:latin typeface="+mn-lt"/>
  </a:defRPr>
</a:lvl1pPr>

Styled Text Boxes = Instant Text Placeholders

I believe this hack vastly increases the utility of the text box. In effect, it becomes a text placeholder that a user can easily add to any slide. Accessing the styles works exactly the same as a text placeholder. Use the Increase List Level button (Indent More on a Mac) to move through the levels.

Here’s a visual comparison of a text placeholder and a styled text box:

Text Placeholder compared to Styled Text Box


Styled Text Boxes – Other Issues

I’ve run across a couple of minor problems that you will need to keep in mind.

  • Picture bullets aren’t going to work. These require building an XML relationship to the bullet image stored in the file, which is very hard to do manually. Don’t bother.

  • Similar to the theme font issue mentioned above, default paragraph spacing in the layout is inherited from the slide master. This means your text box paragraphs will be missing any space before or after that displays in the layout. To fix this, set the paragraph spacing for each level in the layout. It doesn’t have to change, but you still have to set it to include the spacing in the layout XML.

As always, I welcome your questions, feedback and suggestions. Keep hacking!

XML Hacking: Text Box Styles

PowerPoint’s text boxes could really use styles. But wait: they already do! Text boxes styles are built right into the file format, but there is no access to them thorough the program interface. Formatting text boxes using PowerPoint’s user interface is primitive compared to the styling that can be applied to placeholders in PowerPoint. There is no master where you can format text box defaults. The program interface only allows you to set one style, then right-click and choose Set as Default Textbox. And even this default disappears if you click on the Clear All Formatting button (Home>Font group, look for the icon with an eraser over 1 or 2 letters).


Text Box Styles XML

First, let’s clarify our terminology. Text styles in PowerPoint don’t work like any other program, because there’s no Style menu to apply to selected text. Instead, there are levels that you get to by clicking on the Increase List Level (Windows) or Indent More (Mac) buttons. Each level can have a different style.

Fortunately, with some judicious XML editing, you can create 9 preformatted levels of text for your text boxes. They can become nearly the equivalent of a text placeholder that you can add to any slide. This formatting includes line spacing, bullets, indentation, alignments and many other parameters, so this will have to be a 2-part article.

These text box styles will be saved in a theme, so they can be used in other presentations. However, if the theme is applied to Word or Excel, those programs ignore the custom styles and use their standard single-style text boxes. I guess we could expect that when all these settings are storing in a component called presentation.xml. If you’re new to this subject, read XML Hacking: An Introduction. If you’re using a Mac, you should also read XML Hacking: Editing in OS X.

The XML component that contains the text box text levels is ppt/presentation.xml. This component also contains presentation parameters like slide size, slide master ID and a list of slide IDs for all slides in the deck. Below those items is a tag called <p:defaultTextStyle> that contains 9 levels of text formatting. This structure is nearly identical to the text formatting used for default table text, covered in this article: XML Hacking: Default Table Text

Each of the text levels is identical except of a single digit in the name tag, so we can extract one level for an example that will work for all levels. When this is set up, you’ll be able to insert a text box, then click on the Increase List Level button (called Indent More in OS X) to move between styles, just like a text placeholder. Here’s a sample default level:

<a:lvl1pPr marL="0" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1">
  <a:defRPr sz="2400" kern="1200">
    <a:solidFill>
      <a:schemeClr val="tx1"/>
    </a:solidFill>
    <a:latin typeface="+mn-lt"/>
    <a:ea typeface="+mn-ea"/>
    <a:cs typeface="+mn-cs"/>
  </a:defRPr>
</a:lvl1pPr>

This contains 2 different sections: the first line with a string of parameters, plus the list of additional parameters on separate lines below. It’s important to create the right data in the correct location, so for this article, I’m only going to cover the first line.


Text Box Style First Line Parameters

From left to right, the default parameters are:

  1. marL – Sets the left margin for that text level in EMUs. 914,400 EMUs equal 1 inch, while 360,000 EMUs equal 1 centimeter.
  2. algn – Horizontal alignment. A value of l means left aligned. You can also use r for right aligned, ctr for center aligned, just for justified text and dist, which distributes text evenly across the line width, kind of like an extreme form of justification.
  3. defTabSz – Default tab size, again in EMUs.
  4. rtl – Is the language right to left? 0 means no.
  5. eaLnBrk – East Asian Line Break: East Asian languages have rules about where a line break occurs. The 1 value turns this attribute on. A 0 breaks the line wherever needed, without consulting the rules.
  6. latinLnBrk – Similar to the eaLnBreak, a 0 will not break the line without a hyphen, a 1 will break the line wherevere needed without a hyphen.
  7. hangingPunct – Online documentation for this is poor and I couldn’t detect any difference in setting this to 0 or 1. I’ll post an edit when I figure out what this does.

Those are the defaults. Then there are several optional parameters that you can add manually:

  • marR – You can set the right margin of text, in EMUs.
  • indent – Set the first line indent of each paragraph, in EMUs.
  • fontAlgn – Vertical alignment. Acceptable values include auto and base which both set text on the font baseline, which is the default. You can also use b to align with the bottom of the descenders (like the bottom of a g or y), t to align with the ascenders or ctr to center text vertically. This latter setting solves the issue that when you increase PowerPoint bullet size, you also increase the bullet elevation above the baseline. Using fontAlgn=”ctr” forces the bullet to stay aligned with the text whatever size it is.
  • lvl – Determines the numbering level for this text level, independent of the level’s position in the hierarchy of text box styles.

The picture below illustrates 5 levels of formatting in a text box. There is no local formatting applied, all I did was type the text and click on the Increase Indent button to move between levels, exactly as with a text placeholder.

Text box styles from the first line parameters

5 levels of text box text formatted with only the first line <a:lvl#pPr> tag.

XML Hacking: Custom Picture Content Controls

Recently I was creating a white paper template in Word for a client and needed to insert some custom Picture Content Controls for photos that would be inserted by users. The designer had specced round-cornered pictures, but Picture Content Controls (PCC) have square corners. It didn’t take long to figure out that after selecting the PCC, I could choose the Picture Tools>Format tab of the Ribbon, then apply a Picture Style. I chose the rounded corners with reflection (fifth icon over in Word 2010), then removed the reflection.

Now I had rounded corners, but also another problem. Word keeps the corner radius in proportion to the box size, so resizing the PCC up to the right size made the radius much larger than the design. Unlike AutoShapes, Content Controls will not display a yellow radius handle to adjust the radius. I also tried resizing the PCC before applying the Picture Style, but got the same big corners.

Default Picture Content Control

A Picture Content Control with default corner radius.


Custom Picture Content Controls XML

When I’m stuck, I crack open the XML. Can’t leave it alone! If you’ve never opened Office files to edit their XML, read XML Hacking: An Introduction. If you’re using a Mac, you should also read XML Hacking: Editing in OS X. All document content is in word\document.xml, so I opened it and started searching. In some respects, a PCC is handled like an ordinary picture, so I found it inside a <w:drawing> tag. The information I was looking for was in this subsection:

<pic:spPr bwMode="auto">
  <a:xfrm>
    <a:off x="0" y="0"/>
    <a:ext cx="3222172" cy="4576355"/>
  </a:xfrm>
  <a:prstGeom prst="roundRect">
    <a:avLst>
      <a:gd name="adj" fmla="val 8594"/>
    </a:avLst>
  </a:prstGeom>
  <a:solidFill>
    <a:srgbClr val="FFFFFF">
      <a:shade val="85000"/>
    </a:srgbClr>
  </a:solidFill>
  <a:ln>
    <a:noFill/>
  </a:ln>
  <a:effectLst/>
</pic:spPr>

When I spotted the line <a:prstGeom prst=”roundRect”>, i was pretty sure that’s what I was looking for. But inside that tag, there were only 2 parameters. I went for the fmla tag and change the value from “val 8594” to “val 4000”. Because I’m experimenting, I make only 1 change, then zip the XML to test. If you make several changes and the file doesn’t open, it can take a long time to find the error.

I reopened the Word file. Success! The corner radii were about half the size. Then I just had to try several values until I found one that match the designer’s intent. Keep in mind that the fmla value is not setting any particular radius size, it’s setting the ratio of the curve to the size of the picture. So you should make the placeholders the correct size first, then try out fmla values to get the radius you want at those dimensions.

You don’t always get lucky with parameters. A few lines down I spied another setting that looked like it could be useful. While you can set the PCC border in the program interface, you can’t set the fill color. However, in the XML, I saw these tags:

  <a:solidFill>
    <a:srgbClr val="FFFFFF">
      <a:shade val="85000"/>
    </a:srgbClr>
  </a:solidFill>

Unfortunately, changing these values had no effect on the color of the Content Control. So what do these tags do? Search me, maybe someone at Microsoft knows. But I was happy to be able to set the radii to my preference. Here’s the final result:

Custom Picture Content Controls

A custom Picture Content Control with smaller corner radii.

Multiple Color Themes, One Template – Brandwares Best Practices

Multiple color themes in the same PowerPoint template are useful for companies with several divisions or for presenters who need color-coded sections. Here are 3 ways to add that capability to your presentations.


Multiple Color Themes: Using Super Themes in PowerPoint

PowerPoint 2013 and 2016 for Windows and Mac all feature a new theme format developed by Microsoft: the Super Theme:

Super Theme Color Variants
Super Theme Color Variants

The user sees a preview of the color palette that will be used, then picks the variant they want to use. It’s an elegant, attractive interface and makes the design variants plainly visible on the Ribbon. Super Themes also allow the inclusion of size variants, so that resizing a deck doesn’t distort the logos.

Brandwares now creates custom Super Themes, so we can make these for you. However, the technique is tricky, so if you’re an independent designer without the budget for professional assistance, you’ll have to find another way. Fortunately, there are other methods to add multiple color themes.


Multiple Color Themes: Hacking XML

This technique works to add multiple color themes to PowerPoint. You can also add them to Word and Excel files, but those programs won’t show them in the user interface. These extra color themes will travel with a theme saved from such a Word or Excel file, but you already knew that PowerPoint is the program to use for creating theme files. To hack the XML, start by reading XML Hacking: An Introduction. If you’re using a Mac, you should also read XML Hacking: Editing in OS X.

Now, expand your Office file to see the XML. Open the ppt folder, then open the theme folder inside that. PowerPoint saves every theme that’s ever been applied to the presentation, starting with theme1.xml, so you’ll have to check the theme name in each variant to get the right one. If you’re trying this with Word or Excel, look in word\theme or xl\theme respectively, where you will find only one theme1.xml file.

Format the XML to be readable, then go right to the bottom of the listing, where you’ll find the self-closing stub called <a:extraClrSchemeLst/>. First, open up the stub:

<a:extraClrSchemeLst>
</a:extraClrSchemeLst>

Then add a color scheme:

<a:extraClrSchemeLst>
  <a:extraClrScheme>
    <a:clrScheme name="Red-Tan Chart Colors">
      <a:dk1>
        <a:srgbClr val="000000"/>
      </a:dk1>
      <a:lt1>
        <a:srgbClr val="FFFFFF"/>
      </a:lt1>
      <a:dk2>
        <a:srgbClr val="082948"/>
      </a:dk2>
      <a:lt2>
        <a:srgbClr val="FAF9F9"/>
      </a:lt2>
      <a:accent1>
        <a:srgbClr val="C46158"/>
      </a:accent1>
      <a:accent2>
        <a:srgbClr val="E69779"/>
      </a:accent2>
      <a:accent3>
        <a:srgbClr val="699BC5"/>
      </a:accent3>
      <a:accent4>
        <a:srgbClr val="6E9C82"/>
      </a:accent4>
      <a:accent5>
        <a:srgbClr val="1F497D"/>
      </a:accent5>
      <a:accent6>
        <a:srgbClr val="4A8363"/>
      </a:accent6>
      <a:hlink>
        <a:srgbClr val="1F497D"/>
      </a:hlink>
      <a:folHlink>
        <a:srgbClr val="699BC5"/>
      </a:folHlink>
    </a:clrScheme>
  </a:extraClrScheme>
</a:extraClrSchemeLst>

The syntax is exactly the same as for the clrScheme listing that every theme includes as its main color theme, so you can simply copy and paste the whole block of XML. The theme file can hold any number of extra color schemes. When you are using the final file, you can change the theme colors by choosing View>Slide Master>Colors in PowerPoint (actual menu names change in different versions of Office).

Multiple Color Themes

Clicking on the Colors dropdown shows the extra color themes.

When you choose a new color theme, all elements keyed to the color theme will change throughout the presentation.


Multiple Color Themes: Multiple Masters (PowerPoint only)

For Word and Excel, a document can have only one color theme applied at a time, and that theme affects all pages in the file. PowerPoint allows more flexibility, since it can have multiple master slides and each of those master slides has its own color theme. This means that different parts of a PowerPoint file can have different color themes. This is often used to color-code different sections of a presentation.

In its most basic form, this is the simplest technique. No XML hacking required:

  1. In PowerPoint, choose View>Slide Master to view the masters.
  2. Right-click on the Slide Master (the larger slide at the top of the left-hand display) and choose Duplicate Slide Master. The new master is added below the slide layouts for the first master. (In Windows versions, right-click and check that each Master has the Preserve Master attribute checked, or they’ll vanish later.)
  3. Select the new master, then choose Color>Customize Colors.
  4. Revise the color theme, or apply a color theme you created earlier. OK out.

Repeat the steps above for each different color theme you need to include. In the program interface, the user will see a group of slide layouts for each slide master. Here is a presentation where only one colors changes in each color theme:

Each master has its own color theme and slide layouts.
Multiple Master Color Themes

While this is the simplest method to use, it’s not self-evident to all users that you change color themes by choosing a different set of slide layouts. So you’ll probably have to include at least an explanatory note with the template when you distribute it. But what if you want a premium solution for a high-end client? Read on…


Multiple Color Themes: XML Hacked Multiple Masters (PowerPoint only)

A solution that is simpler to use is to combine techniques 2 and 3. Create multiple masters, each with a different color theme. This will create a theme#.xml file in ppt/theme. Open all the theme#.xml file and copy the clrScheme for each to an extraClrScheme tag in all the others. So if you have 3 masters and color themes, copy the clrScheme tag for theme1.xml to an extraClrScheme tag in theme2.xml and theme3.xml. Then copy the clrScheme from theme2.xml to extraClrScheme tags in theme1.xml and theme3.xml.

The result is that it doesn’t matter so much which master you choose, you can change the color theme later. Of course, changing the color theme affects all slides based on the same master. This is an easy-to-use method for providing presentation with sections in different colors.

My thanks to Timothy Rylatt for his assistance with fact checking and corrections in this article.

XML Hacking: Locking Graphics

Locking graphics in Office documents must be #1 on most designers’ wish lists, judging by the number of requests we get. While Word and Excel already do a fairly good job of this, PowerPoint remains wide open. If you can see it, you can move, resize or delete it. Placing items on the Slide Master or Layouts helps, but this is minimal protection against a savvy user. Your users love to be “creative”, so how can we protect the brand from their enthusiasm?

Fortunately, it’s possible to provide protection for important logos and maintain slide layout integrity by editing the template XML. But this power comes with a responsibility to design the protection carefully. It can be a very thin line between a deck that is protected and one that is unusable. If you decide to protect your presentation, it is incumbent on you to test it repeatedly to ensure your users can still get work done with it.

Before trying this, please read my Introduction to XML Hacking. If you’re using OS X, it’s also important to read my notes about Editing XML in OS X.

Locking takes place mostly in the Slide Master and Layouts. A minimal approach is best, as each additional locked item will create more feedback from your users with the potential to increase tech support costs. On the Slide Master, you will probably only lock a company logo.


Locking Graphics: Logos

Start by placing a logo on the Slide Master. Of course, you’re not using a JPEG file, because you already know that’s the worst format for line art. If you still think JPEGs are the best, please read JPEG Logos? Fail! and Logo Production Secrets. After the logo is in place, expand the presentation to view the XML. Open ppt\slideMasters\slideMaster1.xml. All the placeholder coding comes first, so scroll down about halfway until you see XML that looks like this:

<p:pic>
  <p:nvPicPr>
    <p:cNvPr id="7" name="Picture 6"/>
    <p:cNvPicPr>
      <a:picLocks noChangeAspect="1"/>
    </p:cNvPicPr>
    <p:nvPr userDrawn="1"/>
  </p:nvPicPr>

To lock this, we just add one small parameter (in bold):

<p:pic>
  <p:nvPicPr>
    <p:cNvPr id="7" name="Picture 6"/>
    <p:cNvPicPr>
      <a:picLocks noChangeAspect="1" noSelect="1"/>
    </p:cNvPicPr>
    <p:nvPr userDrawn="1"/>
  </p:nvPicPr>

Test this out by re-zipping the files and opening in PowerPoint. Try to select the logo. noSelect=”1″ has the effect of making it unselectable, so the user can’t do anything creative with it, even if they open the master.


Locking Graphics: Shapes

Different graphic objects use a slightly different syntax. The noSelect=”1″ parameter remains the same, but you have to expand a tag and add a new line to include it. For all AutoShapes except lines, the default XML will resemble the following:

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="9" name="Rectangle 8"/>
    <p:cNvSpPr/>
    <p:nvPr userDrawn="1"/>
  </nvSpPr>

Editing the p:cNvSpPr tag as shown below will make the shape unselectable:

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="9" name="Rectangle 8"/>
    <p:cNvSpPr>
      <a:spLocks noSelect="1"/>
    </p:cNvSpPr>
    <p:nvPr userDrawn="1"/>
  </nvSpPr>

Locking Graphics: Lines

At the XML level, lines are referred to as Connectors rather than Shapes. The original XML will look like this:

<p:cxnSp>
  <p:nvCxnSpPr>
    <p:cNvPr id="8" name="Straight Connector 7"/>
    <p:cNvCxnSpPr/>
    <p:nvPr userDrawn="1"/>
  </nvCxnSpPr>

To lock this, edit the p:cNvCxnSpPr tag:

<p:cxnSp>
  <p:nvCxnSpPr>
    <p:cNvPr id="8" name="Straight Connector 7"/>
    <p:cNvCxnSpPr>
      <a:cxnSpLocks noSelect="1"/>
    </p:cNvCxnSpPr>
    <p:nvPr userDrawn="1"/>
  </nvCxnSpPr>

Locking Graphics: Placeholders

Placeholders are the boxes on slide layouts that can hold different types of content. The layouts are found in ppt\slideLayouts. They are numbered in the order that they appear in the left-hand list of layouts in Slide Master view. By default slideLayout1.xml is the Title slide. The XML tag is <p:sp> instead of <p:pic>, but otherwise the syntax is the same for locking. Placeholders do not inherit the lock parameters, so locking a placeholder on the master doesn’t affect the layouts and locked placeholders on the layouts have no effect on the slide placeholders.

You can see what other parameters are possible for the spLocks tag at Datypic’s a:spLocks page. There are options here to prevent grouping the image, rotating, moving or resizing it, changing it’s aspect ratio and several other less useful options. Let’s use some of the other parameters to lock down the shape. Here is the start of a Title placeholder:

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="2" name="Title 1"/>
      <p:cNvSpPr>
    <a:spLocks noGrp="1"/>
  </p:cNvSpPr>

After we add parameters to prevent moving and resizing, the XML looks like this:

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="2" name="Title 1"/>
      <p:cNvSpPr>
    <a:spLocks noGrp="1" noMove="1" noResize="1"/>
  </p:cNvSpPr>

Don’t expect that slides based on this will still have unmoveable placeholders. The lock parameters are not included when a slide is created from a layout. This locking ensures only that the layout remains the same, so when a slide is reset, it will always return to the correct format.

If the placeholders must remain in place on the slides, then you must first create the slide, then edit the XML before distributing the deck. For this, look in ppt/slides. The files are numbered in the order they appear in the presentation, so slide1.xml is usually the title. Here is the XML for a locked title placeholder.The noRot parameter prevents rotation:

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="2" name="Title 1"/>
      <p:cNvSpPr>
    <a:spLocks noGrp="1" noMove="1" noResize="1" noRot="1"/>
  </p:cNvSpPr>

When the user clicks on this, all the adjustment handles have a diagonal through them and the user is unable to change the shape size or position:

Locked Title Placeholder

By default, placeholders cannot be grouped with other objects. If you wish to allow this, simply remove the noGrp=”1″ parameter.


Locking Graphics: Other Objects

By default, the picture and placeholders already include a p:locks or sp:locks tag, which is where we add the locking information. But what if you insert a text box on a layout for a legal disclaimer and want to make it ineditable? The text box XML initially looks like this:

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="7" name="TextBox 6"/>
    <p:cNvSpPr txBox="1"/>
    <p:nvPr userDrawn="1"/>
  </p:nvSpPr>

To lock this, we need to expand the <p:cNvSpPr txBox=”1″/> tag. In case it’s not obvious, to expand a closed tag, you must first delete the slash at the end that closes it. Then you create a new closing tag and put the <a:spLocks&gt> information between the two. The noTextEdit parameter means the text can’t be edited. Even if a clever user gets to the slide layout, they can’t change the text, though the shape is still moveable.

<p:sp>
  <p:nvSpPr>
    <p:cNvPr id="7" name="TextBox 6"/>
    <p:cNvSpPr txBox="1">
      <a:spLocks noTextEdit="1"/>
    </p:cNvSpPr>
    <p:nvPr userDrawn="1"/>
  </p:nvSpPr>

Locking Graphics: Gotchas and Exceptions

After a few months of practical testing, some real-life limitations on shape locking have become evident. Adding the noChangeAspect=”1″ has the same effect as checking the Lock aspect ratio option on the Size pane of the Format Shape dialog. But just as when you check this option manually, clicking on the shape and dragging the adjust handles will still distort the shape. On top of this, I found this page on MSDN: 2.1.1255 Part 4 Section 5.1.2.1.34, spLocks (Shape Locks). The pages states that “Office ignores attributes noChangeArrowheads and noRot when applied to a shape. PowerPoint additionally ignores the attribute noAdjustHandles when applied to a shape and noChangeShapeType when the converting the shape to a freeform.” So a user can circumvent noChangeAspect by dragging on the handles and you can’t prevent the handles from displaying either. Office simply doesn’t implement Microsoft’s own spec completely. There’s nothing you can do about this. It should be noted, that the accuracy of Microsoft’s information is not the best. Their statement that Office ignores noRot=”1″ when applied to a shape is not true, you can successfully prevent rotation with this parameter. You really have to test everything to really know what works and what doesn’t.


Locking Graphics: The Designer’s Responsibility

Powerful? Yes. But with power comes responsibility. Company presentation templates need to be revised, but after you lock items in XML, those shapes can no longer be revised through the program interface. So it’s essential that if you use these techniques, that you document your changes when you send the file to your users. Using these methods secretly to get repeat business from captive clients is dishonest and is definitely not a best practice.