XSL-FO 試行錯誤 カレンダーを自動生成したい(その月のマスの最初の日を取得する)

XSL-FO 試行錯誤 カレンダーを自動生成したい(構想編)の続きとなります。

大抵のカレンダーにおいて、ある月の表における最初の日付は「1日」ではありません。日曜始まりのカレンダーなら、「その月の1日が含まれる週の日曜日の日付」を取得する必要があります。このとき同様に「その月の最終日が含まれる週の土曜日」も考える必要がありますが、今回は割愛します。

XSLT 2.0からは日付関連の関数が使えるので、これを使っていくことにします。

<xsl:transform 
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:fn="http://www.w3.org/2005/xpath-functions"
 xmlns:fo="http://www.w3.org/1999/XSL/Format"
 xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
 xmlns:cal="urn:calendar"
 exclude-result-prefixes="xs fn">...</xsl:transform>

ルートはこんな感じです。foやaxfは今回登場しません。XSLT 2.0からは型の時点でエラーを検知したりといったことが可能なので、XMLSchemaの名前空間はかかせません。xpath-functionsの名前空間は宣言しなくとも使えますが、自作関数との区別用に明示しています。独自に実装する名前空間はcalというprefixを付けることにします(functionのnameには名前空間の明示が必要になります)。

 <xsl:function name="cal:getWeekDay" as="xs:integer">
   <xsl:param name="day" as="xs:date"/>
     <xsl:sequence select="$day => fn:format-date('[F]') => cal:weekDayInteger()"/>
 </xsl:function>

 <xsl:function name="cal:weekDayInteger" as="xs:integer">
   <xsl:param name="wd" as="xs:string"/>
   <xsl:choose>
     <xsl:when test="$wd eq 'sunday'">
       <xsl:sequence select="0"/> 
     </xsl:when>
     <xsl:when test="$wd eq 'monday'">
       <xsl:sequence select="1"/> 
     </xsl:when>
     ...
     <xsl:otherwise>     
       <xsl:message terminate="yes" select="'Invalid input'"/>
   </xsl:otherwise> 
 </xsl:choose>
 </xsl:function>

曜日を0-6のxs:integerで取得することにします。日付の曜日自体はfn:format-date(‘[F]’)で取得できますが、これをxs:integerに置き換えます。これは次回以降、moduloを使って日付の表を埋めていくためです。

「=>」はXSLT 3.0から使える記法で、処理の見た目がすっきりします。cal:weekDayIntegerについてはXSLT 3.0的にはmap{‘sunday’:0, …}のように曜日のstringと対応付ける整数をまとめて、それを展開する形がより望ましいかもしれません。2.0でも外部XMLや、xsl:chooseではなくXPathのifなどにまとめると記述量は減ります。xsl:otherwiseではmessage@terminate=”yes”で処理を強制終了していますが、ライブラリなどとして整備するなら分岐処理前にxsl:assertやxsl:tryなどで対応しておきたいところです。

  <xsl:function name="cal:getFirstDayOfTable" as="xs:date">
   <xsl:param name="firstDay" as="xs:date"/>
   <xsl:param name="weekStart" as="xs:integer"/>
     <xsl:variable name="weekDayOfFD" select="cal:getWeekDay($firstDay)"/>
     <xsl:choose>
       <xsl:when test="$weekDayOfFD eq $weekStart">
         <xsl:sequence select="$firstDay"/>
       </xsl:when>
       <xsl:otherwise>
         <xsl:variable name="dur" select="'P' || string(abs($weekDayOfFD - $weekStart)) || 'D'" as="xs:string"/>
         <xsl:sequence
           select="(xs:dateTime($firstDay) - xs:dayTimeDuration($dur)) =>xs:date()"/>
       </xsl:otherwise>
    </xsl:choose>
 </xsl:function>

その月の最初の日(xs:date)と、左端に来る曜日(xs:integer)を引数にして、初週の左端にくる曜日を取得します。

最初の日の曜日をvariableで持つことで、後で使用しやすくしています。この日が始まりの曜日と一緒なら後の計算はいらないので分岐させます。整数同士の比較です。

一緒でない場合、最初の日から曜日のギャップ分遡った日付を取得する必要があります。

最初の日をdateTimeにキャストし、そこにdayTimeDurationでギャップ分の日をマイナスし、それをxs:dateに戻します。

結果を確認してみましょう。2022年1月のカレンダーの表(日曜始まり)ならば、入力「2022-01-01」に対し「2021-12-26」が期待する結果となります。

<xsl:param name="dateArg" as="xs:date" />
 <xsl:template name="xsl:initial-template">
   <xsl:variable name="weekStart" select="0" as="xs:integer"/>
   <xsl:message>
     <xsl:sequence select="xs:date($dateArg) =>
       cal:getFirstDayOfTable($weekStart)"/>
   </xsl:message>
 </xsl:template>

XSLT 3.0では、ダミーのソースXMLファイルを用意しなくとも上のように「xsl:initial-template」という特殊な名前のテンプレートを使うなどして直接XSLTプログラムを走らせられます。グローバルのパラメータdateArgに入力した月始めのxs:dateを処理した結果を表示してくれます。

果たして私の環境では「2021-12-26」が出力されました。

考慮するケースが足りないかもしれません。無保証であることにくれぐれもご留意ください。

他、関数などに落としこめる事項としては年度の切り換えがあります。これは次回取り組みたいと思います。XSL-FOまでいきませんでした……。

関連記事

XSL-FO 試行錯誤 カレンダーを自動生成したい(構想編)

関連資料

XSL Transformations (XSLT) Version 3.0
W3C Recommendation 8 June 2017



月曜日連載! Microsoft Wordスタイル探索 (46)余白についてー補足

先週の、月曜日連載! Microsoft Wordスタイル探索 (45)インデント機能の基本で、余白について説明しました。

その中で、

本文段落の幅は、通常、文字数×本文文字の大きさになります。すると、用紙の幅から左右余白の大きさを差し引いた値が、文字の大きさの倍数になっていないとき、本文段落の幅とは一致しないで余りがでます。この差(余り)は右余白に追加されます。

と説明しました。しかし、もう少し詳しく調べてみると、この動作は段落の設定によります。

「段落」ダイアログに「一行の文字数を指定時に右のインデント幅を自動調整する」というチェックボックスがあります。

「段落」ダイアログ「一行の文字数を指定時に右のインデント幅を自動調整する」

「段落」ダイアログ「一行の文字数を指定時に右のインデント幅を自動調整する」

前回の説明はこのチェックボックスがONになっているときの動作になります。ONのときは余りが右インデントの値に追加されます。次の図は段落の右インデントがゼロのときの動作です。チェックボックスがONのときは、右インデントがゼロでも余白と本文の終端に空きがあることが分かります。OFFにすると余白と本文の終端の空きがなくなります。

文字数×文字間の値と本文領域の幅の余りの扱い

文字数×文字間の値と本文領域の幅の余りの扱い

なお、チェックボックスOFFで余りがあるときの動作は段落の揃え指定によります。次の図は、段落の揃え設定を「両端揃え」(一番上)、「左揃え」(二番目)、「中央揃え」(三番目)、「下揃え」(一番下)にしたときの余りの位置です。

段落の揃えにより、余りの分配が変化する

段落の揃えにより、余りの分配が変化する

段落の揃えが両端揃えのとき、余りは文字間に分配されます。左揃えでは余りは右余白に追加(右インデントの増加)、中央揃えでは余りは左右余白に配分、右揃えではあまりが左余白に追加(左インデントの増加)として扱われています。

なお、「一行の文字数を指定時に右のインデント幅を自動調整する」チェックONの時は、段落の揃えの設定に関わらず、余りは右インデントの増加として扱われます。


【広告】
11月16日(火曜日)16時からの「ちょっと一息・アンテナハウスウェビナー」YouTubeのご案内。

Vol.1:Word文書をWebページにした例の紹介
Word文書を実際にWebページ(HTML)に変換した実例を紹介します。
Vol.2:Webページ構成要素別のWord編集例
Wordが持つ文書編集機能とWebページ作成時に必要となるHTMLタグがどのように対応しているかをご紹介します。
Vol.3:CSSによる、Webページのレイアウト
見栄えの良いWebページを作成するうえで必須のCSSについて、サンプルファイルを交えながら設定例をご紹介します。
Vol.4:Wordから上手にHTMLにする為の編集アドバイス
WordでWebページの原稿を作成するにあたり注意するべきポイントをご紹介します。


月曜日連載! Microsoft Wordスタイル探索
◆前回:(45)インデント機能の基本
◆次回:(47)本文領域の幅が文字数×文字サイズの値に一致しないときの余りの調整を探索
シリーズ総目次


e-na伊那谷 旅便り 第82回 経ヶ岳

12月に入って雪が舞う日が増えてきました。
こちらは最近のアンテナハウス伊那支店の裏口からの景色になります。
木曽山脈(左・多分)や経ヶ岳(右)に雪が積もるようになりました。

そんな美しい経ヶ岳を見て思い出したので今回はこちらをご紹介します。

アンテナハウス伊那支店の所在地である南箕輪村の中学校で毎年行われている経ヶ岳強歩大会です。

南中伝統 経ヶ岳強歩大会 https://ina-dani.net/topics/detail/?id=44218

画像出典:南中伝統 経ヶ岳強歩大会 | ニュース | 伊那ねっと Copyright(C) 2021 InaCATV.

南箕輪中学校の全校生徒が大芝高原から一斉にスタートし、ゴールの経ヶ岳8合目を目指す伝統行事。
どこの学校でもマラソン大会などあったと思いますが、それに該当するものです。
コース全長8.3 km、ゴール地点は標高2035 m(スタート地点との標高差はおよそ1200 m)。
中学生の時によく完走できたなあ、若いっていいなあと感慨深くなります。
ゴールからの景色は未だに覚えています。

伊那谷ねっと「南箕輪中学校 距離短縮で強歩大会開催」
https://ina-dani.net/topics/detail/?id=58020

昨年は新型コロナで中止、今年は大泉所ダムで折り返しだったそうで、来年は再開しているといいですね。

この記事を読んで大人だけど興味が沸いて登ってみたいなあと感じた方、
そんな方にはコチラ、経ヶ岳バーティカルリミットをご紹介します。

経ヶ岳バーティカルリミット
http://www.nature-scene.net/kyogatake/

強歩大会とは異なり上るのは山頂まで、かつ折り返しするのでゴールはスタート地点。
標高差も大きくなり、コースも長くなり、完走以前に山頂までたどり着けるか心配になります。
昨年、今年は新型コロナで中止となっていたようで、こちらも来年は開催できることを期待しましょう。
私も今の体重から15kgくらい落とせてBMIも15を切れたらチャレンジしてみようと思います。


月曜日連載! Microsoft Wordスタイル探索 (45)インデント機能の基本

Wordのインデントは段落の右端あるいは左端の位置を変更します。また段落の先頭行のみの字下げ、あるいはその逆に先頭行のみを突き出し(2行目以降をぶら下げ)にする設定もできます。

Wordのインデントを増減するにはいろいろな指定の仕方があり、単位の設定なども関係していて複雑です。インデントを探索するにあたり、最初にインデントとは何かを簡単にまとめてみます。

余白
インデントは余白からの相対量になっているので、まず余白を説明します。余白は用紙の端から本文の文字入力領域までの間隔です。用紙の上下左右と行頭・行末の関連付けは横書きと縦書きで異なるので、以下は横書きを前提として説明します。
・上余白:用紙の上から本文の一番上の行までの空き
・下余白:本文の一番下の行と用紙の下端までの空き
・左余白:用紙の左端から本文の行頭位置までの空き
・右余白:用紙の右端から本文の行末位置までの空き
なお、Wordでは行や段落の前後には読みやすくするための空きが確保されるため、横書きでは用紙の上端と本文の一番上の行の上辺の間隔は余白と一致するとは限りません。つまり上余白を20mm確保したとしても、印刷したとき用紙の上端と文字の上端には20mmよりも大きな空きができることがあります。
また、本文段落の幅は、通常、文字数×本文文字の大きさになります。すると、用紙の幅から左右余白の大きさを差し引いた値が、文字の大きさの倍数になっていないとき、本文段落の幅とは一致しないで余りがでます。この差(余り)は右余白に追加されます。このため印刷すると見かけ上の右余白は指定した量よりも増えることになります。

上記の余りの扱いについては次回の補足も参照してください。月曜日連載! Microsoft Wordスタイル探索 (46)余白についてー補足

インデント
インデントは段落単位で、余白を規準にして行頭と行末の位置を増やしたり減らしたりする機能です。インデントをプラスにすると余白が広がり、マイナスにすると余白が狭くなります。横書きでは左インデントで行頭の位置を指定します。次の段落(1)は左インデントをプラス1文字、(2)は左インデントをマイナス1文字に設定した例です。

段落の左インデントを1文字増やしたり減らしたり設定

段落の左インデントを1文字増やしたり減らしたり設定


次の段落(3)は右インデントをプラス1文字、(4)は右インデントをマイナス1文字に設定した例です。
段落の右インデントを1文字増やしたり減らしたり設定

段落の右インデントを1文字増やしたり減らしたり設定


インデントの設定
インデント機能はリボン「ホーム」の「段落」ダイアログから設定できます。
段落ダイアログのインデント設定

段落ダイアログのインデント設定


リボン「レイアウト」の段落グループでも左右のインデントを設定できます。
リボン「レイアウト」のインデント設定

リボン「レイアウト」のインデント設定


リボン「ホーム」には他に「インデントを増やす」、「インデントを減らす」コマンドがあります。
インデントを増やす、インデントを減らす

インデントを増やす、インデントを減らす


また、インデントマーカーをマウスでドラッグしてインデントを設定する方法もあります。
インデントマーカー

インデントマーカー


これだけでも結構多いと思いますが、どうやら他にもまだあるようです。指定方法が多様なのは便利なのか分かりにくいのか、少しばかり疑問です。次回はもう少し深く追求してみたいと思います。


【広告】
11月16日(火曜日)16時からの「ちょっと一息・アンテナハウスウェビナー」YouTubeのご案内。

Vol.1:Word文書をWebページにした例の紹介
Word文書を実際にWebページ(HTML)に変換した実例を紹介します。
Vol.2:Webページ構成要素別のWord編集例
Wordが持つ文書編集機能とWebページ作成時に必要となるHTMLタグがどのように対応しているかをご紹介します。
Vol.3:CSSによる、Webページのレイアウト
見栄えの良いWebページを作成するうえで必須のCSSについて、サンプルファイルを交えながら設定例をご紹介します。
Vol.4:Wordから上手にHTMLにする為の編集アドバイス
WordでWebページの原稿を作成するにあたり注意するべきポイントをご紹介します。


月曜日連載! Microsoft Wordスタイル探索
◆前回:(44)Word文書をHTMLに変換するHTML on Word V1.1で表のヘッダー行、ヘッダー列の変換機能などを追加
◆次回:(46)余白についてー補足
シリーズ総目次


書籍のHTML版の構造を考える(OOXML入門第2版)

12/07に「『Office Open XML Formats入門 第2版』制作報告」のウェビナーを行いました。ウェビナーで言及したように、『Office Open XML Formats入門 第2版』はHTML版も制作中です。

編集用XMLであるSimpleDoc(の改造版)はほぼHTMLの文法なので基本的にはそのままです。
とはいえ、そのままで出せるかというとそうでもなく、「表示媒体の違い」へ意識を向ける必要があります。本記事ではその辺りについて「こんなことを考えながら作っています」という話です。

形式

まず、HTMLとしてはHTML5、もといLiving Standardに合わせています。他社コンテンツを制作するような場合に比べれば更新の自由が利きますし、セマンティックな語彙が多い方が嬉しいですね。変換自体にはXSLT 3.0を利用しています。

スタイル設定

SCSSで大本を記述した後、CSSに変換したものをlinkの読み込み対象にしています。あるページ特有のスタイルというものは無かったため「_color.scss」「_header.scss」、「_footer.scss」これらを読み込む「common.scss」のようになっています。

ページ分割とナビゲーション

まずページ分割単位の決定。「最終的に1ページのHTMLファイルに収める」というのはそれなりの文量のある書籍では現実的ではありません(動的に内容を取得するのであればそういった方法もあるでしょう)。今回は「章単位でフォルダーを分け、節単位でファイルを分ける」ということにしました。
余談として、DITAではDITA-OT標準のHTML出力を行うとトピックごとにページが分けられます。書籍の形態を重視する場合はこのトピック単位というのは個人的にはやや扱いづらいものであったりします。

ナビゲーションの追加について。特に静的なページとして用意する場合、次の箇所へ遷移する方法の確保は重要です。HTML版用に新たに考えるべき項目としては「常に目次をページ内に配置する」「前後の箇所へのリンクを配置する」「検索用のページを用意する」といったことが挙げられます。

「常に目次をページ内に配置する」については「目次へのリンクを各ページに配置する」で濁してあります。ページごとに記述量が増えて若干デバッグがしづらくなるためです。全ページに目次を配置した場合も、ファイルサイズとしては誤差でしょう。「iframeタグで目次ページを表示させる」ことも可能ですが、今回はリンクを選択しました。

コンテンツの配置レイアウト

body/headerに章題と章トップページ・目次ページ・前後ページへのリンク、body/footerに前後ページへのリンク、body/main内にそのページのコンテンツを配置しました。
書籍と構成は変わるものの「常に(画面上という意味でなく)表示されて欲しい情報」とコンテンツとして欲しい情報といった整理を行うことに変わりはありません。

書籍版と見せ方を変えるもの

Webブラウザーでは紙の本ではできない操作が可能です。今回、次のような変更をしています。

  • コードブロックにoverflow:scrollを設定。
  • h3のsection内容をdetailsタグでアコーディオン表示設定。
  • 画像にwidth:100%を指定。

記事内容の主題といっても良い箇所だと思うんですが、3行で終わってしまいました。

相互参照、リンク

これは「できるならやった方が良い」という話です。HTML版用に新たに用意するにはコストが高く、やるのであればHTML版に関係なく取り組む価値があります。
書籍内の単語や索引、図参照などをハイパーリンクとして設定することについて、元原稿であまり積極的に設定していなかったためにほぼ見送りました。PDF用にリンク用の機構をしっかり準備、活用していれば流用できただけに惜しいです。

メタデータ

「メタデータ、head内をどこまで用意するか」といった話があります。「この場所(弊社Webサイト)にこのコンテンツがあることを知っている」方に対して公開する向きが強いため、ひとまず先送りにできるだろうということがあげられます。
JSON-LDによるメタ情報の追加やサーチエンジン巡回用のRobots.txt、といったものですね。

最低限の項目としてtitle、言語、エンコーディング、viewportの初期値といったものは設定しました。これらは文字化けやモバイル端末での表示性確保として最低限設定すべき箇所でしょう。

OGPについてはある程度用意した方がSNS上でのリンク表示が見栄えするのである程度は確保したいので悩ましいところです。

作業が完了していないこともあり今回はこの辺りで。HTML版(、そして販売準備中のプリントオンデマンド版も)の完成まで少しだけお待ちください。

参考資料


月曜日連載! Microsoft Wordスタイル探索 (44)Word文書をHTMLに変換するHTML on Word V1.1で表のヘッダー行、ヘッダー列の変換機能などを追加

Word文書をHTMLに変換するツールHTML on WordがV1.1となりました。

英語版を用意
V1.1ではWindows(OS)の表示言語を英語に設定しているとき、インストーラの言語表示が英語になります。また英語版のオンラインマニュアルを用意しました。

表のヘッダー変換機能を追加
変換機能についてもいくつかの機能追加を行いましたが、目玉は表のヘッダーの変換機能です。

HTMLを編集する上で表の編集は厄介です。一方、Wordには簡単に画面で対話的に表を編集する機能があるので、Wordで表を編集してそのままHTMLに変換できればHTMLの表編集が簡単になります。

HTMLの表ではヘッダー行(thead)やヘッダーセル(th)を指定できます。Wordではそれに1対1に対応する機能はありません。

そこでWordで表を編集する際の操作を一工夫してヘッダー行、ヘッダー列を指定するとHTMLのヘッダー行(thead)やヘッダーセル(th)に変換できるようにしました。

表の先頭行を見出し行にする
表の見出しタグ(テーブルヘッダ:thead)を出力するには、表の先頭行に次のどちらかを設定します。
① 表の先頭行を選択して、Wordのリボン「表ツール:レイアウト」の「タイトル行の繰り返し」をオンにする。

リボンの表ツール:レイアウト

リボンの表ツール:レイアウト


② Wordのリボン「表ツール:テーブルデザイン」の「表スタイルのオプション」で「タイトル行」のみにチェックする。
リボンの表ツール:テーブルデザインの表スタイルのオプション

リボンの表ツール:テーブルデザインの表スタイルのオプション

表の先頭列を見出し列にする
表の先頭列を選択して、Wordのリボン「表ツール:テーブルデザイン」の「表スタイルのオプション」で「最初の列」のみにチェックすると先頭列のセルを見出しセルに設定します。

リボンの表ツール:テーブルデザインの表スタイルのオプション

リボンの表ツール:テーブルデザインの表スタイルのオプション

変換例
次はWordで先頭行を見出し行にした例(上)と先頭列を見出し列にした例(下)です。
CSSで見出しに対しては次のように指定しています。
・バックグラウンドカラー:Navy
・フォントの色:白

表のヘッダーを設定して変換した例

表のヘッダーを設定して変換した例

こうしてWordで作成した表をHTMLに変換するとき先頭行または先頭列をヘッダーにできるようになります。


【広告】
11月16日(火曜日)16時からの「ちょっと一息・アンテナハウスウェビナー」の録画がYouTubeで公開されております。


※画像をクリックするとウェビナーのアーカイブページに移動しますので、そちらからYouTubeをお進みください。


月曜日連載! Microsoft Wordスタイル探索
◆前回:(43)Wordのコピー&ペーストによるハイパーリンク作成
◆次回:(45)インデント機能の基本
シリーズ総目次


e-na伊那谷 旅便り 第81回 (続々)人形浄瑠璃に興味はありますか?

「e-na伊那谷 旅便り」にて、過去に2回ほど人形浄瑠璃についてご紹介しました。

第41回 人形浄瑠璃に興味はありますか?
 https://blog.antenna.co.jp/ILSoft2/archives/12130
第61回 (続)人形浄瑠璃に興味はありますか?
https://blog.antenna.co.jp/ILSoft2/archives/12921

新型コロナウィルスの影響で昨年はほとんどの公演が中止となってしまいましたが、今年は公演を行うことができましたのでいくつかご紹介します。

  • 第16回伊那谷伝統文化公演 ※前回の記事で紹介した公演です。
  • 信州の伝統芸能フェスティバル in 白馬(Bプログラム)
      公演外題:寿式三番叟
      古くは風除け祈願として舞ったものを、現在では芝居公演などの幕開き後に舞台清めとしてお囃子を入れて行っています。
      ※長野県による文化芸術情報発信サイト「カルチャー・ドット・ナガノ」の特集レポート(https://www.culture.nagano.jp/special/6276/
      ※youtubeでの動画配信(https://youtu.be/IhHWF9hETVQ?t=1937)

また、毎年12月第1土曜日に古田人形芝居伝承の地である箕輪町の文化センターにて定期公演が行われています。

昨年は公演時間を短縮し「技能伝承発表会」として小中学生のみの公演を行いましたが、今年は新規感染者数の激減に伴い例年通り保存会の公演も行われるとの事です。
もちろん感染症対策を行いつつの公演になりますが、こういった事からも日常が戻りつつあることを実感できますね。

R3年古田人形芝居定期公演チラシ

R3年古田人形芝居定期公演チラシ

自主事業「令和3年度古田人形芝居定期公演」の開催について

これまで人形浄瑠璃についてご紹介してきましたが、少しでも興味を持っていただけたらうれしく思います。


月曜日連載! Microsoft Wordスタイル探索 (43)Wordのコピー&ペーストによるハイパーリンク作成

本連載の第41回『HTML on Word』の使用例(5)ハイパーリンクの編集と変換で、Microsoft Wordのハイパーリンク作成機能の概要を紹介しました。

その後、これをもとに、WordのハイパーリンクとHTML変換のWeb記事を書こうと考えて調べていたところ、Wordには「コピー&ペースト」でハイパーリンクを作成する機能があることが分かりました。次に本機能を簡単に紹介します。

リンク貼り付け
リンクのターゲットにしたい文字列などを選択、コピーし、次にそれを貼り付けるとき「形式を選択して貼り付け」のダイアログで「リンク貼り付け」をチェックします。

リンク貼り付けを選択

リンク貼り付けを選択

リンク貼り付けでは貼り付ける形式を選択できますが、Word Hyperlinkを選択すると貼り付けた箇所からコピー元の位置をターゲットとするリンクを設定できます。

リンク貼り付けを実行すると、ターゲット位置の前に「_Hlk」から始まる数字を含むブックマークが自動的に設定されます。

自動的に作成したブックマーク

自動的に作成したブックマーク

なお、リンク貼り付けで、Word Hyperlink以外の形式を選択すると、ハイパーリンク形式ではなくてフィールド機能を使うため、ハイパーリンクにはなりません。なお、このWord Hyperlinkは比較的新しい機能とみられます。docxのファイル形式が最新(2019年11月時点)でないと使えません。

次は、文書の冒頭の文字列をコピーしてリンク貼り付けをした例です。

Word Hyperlinkでリンク貼り付けを設定したテキスト

Word Hyperlinkでリンク貼り付けを設定したテキスト

関連記事:
ハイパーリンクとは何? Microsoft Wordのハイパーリンク編集機能の概要とWebページのハイパーリンクに変換する方法


【広告】
10月12日「ちょっと一息・アンテナハウスウェビナー」の録画がYouTubeで公開されております。(リンクをクリックするとYouTubeを表示します。)

(1)【WordでHTMLが書けたらすごい!】-vol.1 予備知識

「コンテンツ」、「HTML」、「タグ」、「レイアウト」、「CSS」といった基礎知識の説明です。

(2)【WordでHTMLが書けたらすごい!】-vol.2 タグを書かずにHTMLを作る、これまでの方法

「タグ」を書かずにHTMLをつくる、代表的なサービスや技術、問題点などを簡単に紹介します。

(3)【WordでHTMLが書けたらすごい!】-vol.3 WordからHTMLを作る、これまでの方法

Wordでも、HTMLは作れます。また、Word文書からHTMLを作る方法もいろいろ世間に提供されています。しかし、やはりあまり使われてはいないようです。なぜでしょうか。

(4)【WordでHTMLが書けたらすごい!】-vol.4 新しい解決策:『HTML on Word』

Word文書を「綺麗な」HTMLにすることを可能にした、新しい解決策『HTML on Word』を、簡単なデモを交えて紹介します。うまく使うには「印刷用」というレイアウトからの脱却が必要です。


月曜日連載! Microsoft Wordスタイル探索
◆前回:(42)Wordの箇条書き再訪
◆次回:(44)Word文書をHTMLに変換するHTML on Word V1.1で表のヘッダー行、ヘッダー列の変換機能などを追加
シリーズ総目次


2022年1月1日より施行される電子取引データ保存義務をご存じですか?

法人税法とその施行規則では、取引書類を書面で保存することを義務付けています。

取引書類は書面(紙)で保存する義務がある

取引書類は書面(紙)で保存する義務がある

電子帳簿保存法第四条の規定により、所定の要件を満たせば、紙に代えてデジタルデータで保存ができます。これは希望する場合のみのオプションです。

電子帳簿保存法(電帳法四条):紙に代えてデジタルデータで保存できる

電子帳簿保存法(電帳法四条):紙に代えてデジタルデータで保存できる

電子帳簿保存法第七条ですべての電子取引データをデジタル保存する義務が課されています。本条は2022年1月から施行されます。

電子帳簿保存法第七条(電帳法七条):電子取引データのデジタル保存義務

電子帳簿保存法第七条(電帳法七条):電子取引データのデジタル保存義務

来年から、書面による取引と電子取引という取引形態によって、異なる保存規制がかかるため、大変やっかいなことになります。

書面保存とデータ保存の二重規制への対処

書面保存とデータ保存の二重規制への対処

私たちはどうしたら良いでしょうか? 一緒に考えてみましょう。

ウェビナーのご案内

ウェビナーのご案内

ウェビナー申込URL
https://majisemi-business.doorkeeper.jp/events/129651


XSL-FO 試行錯誤 カレンダーを自動生成したい(構想編)

師走まで間もなくとなり、日中の気温もかなり下がってきました。来年のカレンダーを用意する時期ですね。
ちょっと「XSL-FOでオリジナルのカレンダーを作りたい」なんてこともあるのではないでしょうか。

高々12月分であるのでDTPソフトウェアやXSL-FOの直書きで頑張っても何とかなるかもしれませんが、来年もある程度使い回せるようにしたり、2021年のように直前の変更があるかもしれないことを考えると自動化したいところです。

実現したいカレンダーは次のようなものを想定します。手書きであるため半端なところまでしか日付がありません。

実現したいカレンダーのラフ

今回は構想編ということで、方針や使っていくFO、XSLTのアタリを付けていきましょう。

ページレイアウト

カレンダーを作るにあたって、先ず決めなければいけないことは「どの程度グラフィカルにするか」、具体的にはページレイアウトをどこまで制限するか、ということです。
個別箇所の自由度を上げるとその分だけ自動化できる箇所は少なくなります。

とはいっても、「高々12月分」と書いたように12パターン程度であれば12通りのページレイアウトを用意しても良いでしょう。今回はページレイアウトを1つに定めることにします。

  • ページレイアウトは1つ
  • 毎月1ページで構成

(スケジュール帳を組むのであれば「1月分の中にページ分割はあるか」も考慮しなければなりません。AH XSL Formatterであれば見開き要素が使えるため比較的簡単に対応できます。その場合は、見開きの左右に分割される位置と格子の位置を上手く配置する工夫が必要になりますね。)

ページサイズはA3縦(縦420mm、横297mm)にしましょう。

毎ページ登場する内容

月ごとにページを分けるのであれば、各ページに共通して登場するのは
年でしょうか。来年であれば「2022年」ですね。これはstatic-contentに置くことにします。
また、年度(4月始まり)で設定したい場合、途中で年の表示は変わりますね。このことに備えて、マーカーで取り出した値を使うことにします。

後述するように画像を上半分にページ幅一杯に表示する際、画像の上にstatic-contentを被せて表示することが可能です。AH XSL Formatterではregion表示の優先順位も自由が利きます。

マス目表示を実現するFO

ここは奇をてらわずtableを使っていきます。

カレンダーでは、曜日をカラムのタイトルとして、1週目、2週目、…をrowのまとまりとして、それぞれの日付がセルとして表されます。
常にマス全体を長方形にすることとして、rowの数は5週分にします。

例示した画像のように日付の始まりと曜日の始まりが一致するなら並べるだけなので楽ですが、そうではないためXSLTで自動化することになります。当月の他、その先月または来月の数日間の情報が必要になることも、お手元のカレンダーから想像が付くのではないでしょうか。

元となるカレンダー用のXMLがある場合は、そこにテンプレートを適用するだけで済むでしょう。

日付の位置を調整して自動生成するXSLT

XSLT 2.0からは日付のための関数や型を利用できます。ある日付の曜日を取りたいときはたとえばformat-date('[w1]')とすればxs:integer型ではありますが曜日が取得できます。このことと日付用のduration、そしてmodを組み合わせればカレンダーのマス目が実現できそうです。

休日・祝日(今回は対応しない)

休日、祝日の背景色を変更することについて考えます。日曜を示すカラムが先に決まるため「毎週日曜の背景色を変更する」であればカラムに対して設定したりすれば良いでしょう。問題は祝日です。XSLTの標準ライブラリは日本の祝日対応まではしてくれていません。確実なソースとなると、内閣府のページにあるCSVでしょうか。

「国民の祝日」について – 内閣府

XSLT 2.0以降でCSVをパース可能なようにプログラムを書くこともできますが(<xsl:analyze-string>などを使います)、とりあえず今回は対応しないことにします。

そのほか二十四節気なども同様に、「どこかから日付と紐付いた外部ソースを得る」「XSLTで取り込んで展開する」といった手順になるでしょう。

各月のイラスト、写真の設定方法

話をFOメインに戻します。

ページレイアウトは1つだけにすることを決めました。
AH XSL Formatterではページマスターに背景画像を設定することも可能ですが、
1つのページレイアウトを使い回すのであれば、フローコンテンツとして指定していく形になるでしょう(実はマーカーに画像を指定することも可能ですが、テンプレートの記述量は大して変わりません)。

画像のクリッピングや位置調整については背景画像の方がプロパティ指定の余地が広いため、ブロックコンテナーの背景画像として配置することにします。

画像をページギリギリまで表示したい場合、フローコンテンツを塗り足し領域まで表示させる必要があります。この辺りのTipsは『AH XSL Formatter 拡張仕様使いこなしガイド』に載せていたりします。

次回予告

次回はカレンダーを実現するための関数、テンプレートについて考えていく予定です。

参考資料



Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 221 222 223 Next