# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[image-inlinemacro]
<inlinemediaobject>
  <imageobject>
  <imagedata fileref="{imagesdir=}{imagesdir?/}{target}"{width? contentwidth="{width}"}{height? contentdepth="{height}"}/>
  </imageobject>
  <textobject><phrase>{alt={target}}</phrase></textobject>
</inlinemediaobject>

[image-blockmacro]
<figure{id? id="{id}"}{role? role="{role}"}{reftext? xreflabel="{reftext}"}{pgwide-option? pgwide="1"}><title>{title}</title>
{title%}<informalfigure{id? id="{id}"}{role? role="{role}"}{reftext? xreflabel="{reftext}"}>{pgwide-option?<?dbfo pgwide="1"?>}
# DocBook XSL Stylesheets custom processing instructions.
<?dbfo keep-together="{breakable-option#auto}"?>
<?dbfo keep-together="{unbreakable-option#always}"?>
<mediaobject>
  <imageobject>
  <imagedata fileref="{imagesdir=}{imagesdir?/}{target}"{width? contentwidth="{width}"}{height? contentdepth="{height}"}{scaledwidth? width="{scaledwidth}" scalefit="1"}{align? align="{align}"}/>
  </imageobject>
  <textobject><phrase>{alt={target}}</phrase></textobject>
</mediaobject>
{title#}</figure>
{title%}</informalfigure>

#-------------------------
# book document type
#-------------------------
ifdef::doctype-book[]

[header]
template::[header-declarations]

<book lang="{lang=en}">
<bookinfo>
template::[docinfo]
</bookinfo>

[footer]
</book>
