summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/biblatex-gb7714-2015/biblatex-gb7714-2015-content.tex
blob: 72770b9ea870f0732cfa7c3587fb4f23ada43dd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415

%------------------------------------------------------------
%-----------------标题和目录---------------------------------
\titleformanual{符合GB/T 7714-2015标准的biblatex参考文献样式
\footnote{This Manual was created with biblatex v\versionofbiblatex, last revised at \today;\\ \hspace*{1.5em} Style Files (gb7714-2015*.*) have version number: \versionofgbtstyle.}}
\authorformanual{胡振震\setcounter{footnote}{0}\footnote{Email: hzzmail@163.com}}
\dateformanual{2016-07-01}
\titleandauthor
\phantomsection
%\addcontentsline{toc}{section}{目录}
\tableofcontents
%\renewcommand{\numberline}[1]{#1~}
\phantomsection
\addcontentsline{toc}{section}{示例}
\listofegcode
%------------------------------------------------------------

\section{概述}
提供了符合GB/T 7714-2015~信息与文献~参考文献著录规则要求的biblatex参考文献样式。分为两种编制方式:一、顺序编码制;二、作者年制。主要特点包括:
\begin{enumerate}
  \item 兼容性

自biblatex-gb7714-2015宏包发布以来,一直秉承兼容各版本biblatex的原则,可与所有biblatex 2.8(texlive2014) 以上版本配合使用。并解决在不同文档类特别是beamer类中使用问题。兼容一些老的参考文献类型,比如www/electronic/conference/mastersthsis/phdthsis/techreport/standard,并为报纸析出的文献新增加了newpaper类型。

  \item 易用性

从biblatex-gb7714-2015宏包设计的最开始就遵守尽可能让用户减少对于bib文件准备等方面的关注,用户可以很简单的输入或者从网络上下载(如百度学术、zotero等)参考文献信息然后直接使用,而不需要因为参考文献包的要求而特别地去修改增添参考文件信息,如参考文献类型和载体标识、语言等。并为用户提供全面、详实的说明,包括
\href{https://github.com/hushidong/biblatex-gb7714-2015/wiki}{WIKI},
\href{https://github.com/hushidong/biblatex-solution-to-latex-bibliography/blob/master/biblatex-solution-to-latex-bibliography.pdf}{LaTeX 文档参考文献的biblatex解决方案}等,以帮助用户更好的入门。

  \item 灵活性

biblatex-gb7714-2015宏包除了能提供严格遵守GB/T 7714-2015标准的格式外,还通过增加很多新的用户设置选项,使用户可以根据自己的需求很灵活调整参考文献表的生成。包括标签的对齐方式、出版项缺省时的处理、作者缺失时的处理、作者姓名格式的调整、文献类型和载体标识等信息的输出控制等。能通过标注和著录分别采用作者年制、顺序编码制样式实现特殊的参考文献格式,并尽最大可能利用biblatex的选项来实现一些特殊需求,比如文献表中作者数量大于3、标注中严格仅给出第一作者的姓、参考文献表按拼音或笔画排序等等。
\end{enumerate}

具体来讲,完成了4个方面的工作:
\begin{enumerate}
  \item 完成了GB/T 7714-2015标准的完整实现,包括两种编制方式下的各类型参考文献著录格式和标注格式等基本内容,还包括: 双语文献格式,带页码的标注格式,作者年制下仅有年的标注格式和文献按语言集中并自动排序,起止卷期自动解析,增加gbnoauthor选项控制作者年制责任者缺省的处理,增加gbpub选项控制出版信息缺省时的处理,增加gbalign选项控制顺序编码制文献表的标签对齐方式,提供右对齐、左对齐和项对齐三种方式。
  \item 实现了用户文献数据录入优化,用户在录入参考文献数据时,只需要录入文献的实际信息即可,不需要录入文献标识符和载体标识符,无需录入language或者其它域信息来区分中英文参考文献,实现中英文自动判断并处理。支持一些特殊或老的条目类型,比如standard,newspaper,www,mastersthesis,phdthesis等。
  \item 实现了对biblatex不同版本的兼容,能够应用于biblatex3.2以前的老版本,也能用于3.3版姓名处理方式改变后的版本。即可以与texlive2014/2015/2016/2017配合使用,无需升级biblatex情况下直接使用biblatex-gb7714-2015宏包(即本样式)。
      \bc{当然 ctex2.9.4 的用户可能要升级一下biblatex,因为ctex多年没有更新,其中的biblatex版本过低}。
  \item 测试了样式文件在book/report/article文档类以及beamer类下的适用性,结果表明均能满足要求。文档详细介绍了样式文件的使用方法和注意事项,说明了各条目类型的著录格式及其在biblatex 中对应信息域的构成,以及域信息的录入方法,并严格按照GB/T 7714-2015 标准测试了各种类型的文献。
\end{enumerate}

样式文件由如下文件构成:

顺序编码制的 \zd{gb7714-2015.bbx},\zd{gb7714-2015.cbx} 文件和作者年制的
\zd{gb7714-2015ay.bbx},\zd{gb7714-2015ay.cbx} 文件。

说明文档源文件包括:

\zd{biblatex-gb7714-2015.tex},\zd{eg*.tex}分别是本样式说明文档和测试用例。

脚本文件包括:

\zd{*.bat}和\zd{*.sh}分别是windows下和linux下的编译脚本。\zd{*.pl}是用来将gb7714格式的著录文献文本转换为bib文件的perl脚本,
\zd{*.dat}是用于转换的测试文本文件。

\subsection{biblatex宏包的参考文献生成方法}
biblatex生成参考文献有其优越性。笔者从最初开始学习latex时利用thebibliography环境生成参考文献,到后来对格式化参考文献有更多需求,开始寻求利用参考文献宏包,再到最后选择了使用biblatex宏包[也由于对bibtex语言不熟悉,偷懒不想学$( \hat{} \bot \hat{} )$],经过大量的实践总结biblatex宏包参考文献生成的优点如下:

\begin{enumerate}
\item 使用简单。样式随宏包加载,参考文献源bib文件利用addbibresource加载,打印文献表利用printbibliography命令可以在文档任意位置打印。参考文献只需三步编译,第一遍xelatex,第二遍biber,第三遍xelatex,当然如果需要反向超链接,除设置backref 选项外,还需要第四遍xelatex。例\ref{eg:compile:cmd} 给出编译命令,其中xelatex命令也可以用mklatex -xelatex 代替,--synctex=-1选项也可以是-synctex=1。

    \begin{codetex}{使用biblatex宏包的文档编译命令}{eg:compile:cmd}
    xelatex --synctex=-1 jobname.tex
    biber jobname
    xelatex --synctex=-1 jobname.tex
    xelatex --synctex=-1 jobname.tex
    \end{codetex}
%使用够方便

\item 划分自由。利用biblatex宏包可以在一个文档中生成任意数量的参考文献表,而不需要用include把分档划分成不同的文件来生成分章参考文献。利用refsection 和refsegment可以很方便地划分参考文献节,甚至还可以嵌套使用。
%划分很自由,划分无限制

%处理无限制,支持更全面
\item 支持全面。后端处理程序biber处理大数据量参考文献毫无压力,不用担心bibtex可能存在的内存不足等局限,字符编码也支持utf-8,完全支持中文的bibtex键(引用关键字)。此外,biber还具有根据拼音和笔画排序(例\ref{eg:sort:bibercmd})、输出引用文献的数据(例\ref{eg:bibercmd:outbibfile})等其它更多功能。

        \begin{codetex}{中文文献排序时的biber选项}{eg:sort:bibercmd}
        %按拼音排序,biber命令
        biber -l zh__pinyin jobname
        %按笔画排序,biber命令
        biber -l zh__stroke jobname
        \end{codetex}

        \begin{codetex}{输出引用文献数据时的biber选项}{eg:bibercmd:outbibfile}
        biber jobname.tex --output-format=bibtex
        \end{codetex}


\item 定制方便。biblatex宏包实现参考文献著录格式使用的是tex语言,相比传统的bibtex 语言学习更为容易。biblatex 提供了很多不同类型的参考文献标准样式,查看、参考和引用都很方便,因此定制起需要的参考文献格式也很便捷。
%定制很容易
%\item 学习无障碍,因为biblatex宏包用的是tex语言,所以查看代码,学习都很方便,自然也便于生成需要的参考文献样式。
%\item 定制很容易,biblatex提供了很多不同的参考文献标准样式,学习参考都很方便,因此定制起需要的参考文献格式来非常容易。
\end{enumerate}

%上述这些优点也是笔者决定编写符合GB/T 7714-2015标准的参考文献样式文件的原因之一。

下面直接给出最小工作示例的tex源文档(例\ref{code:doc:structrue}),用以简单介绍biblatex宏包参考文献生成的一般方法。给出的详细注释,说明了使用biblatex的文档基本结构,所有基于biblatex生成参考文献的文档无论大小万变不离其宗,当然除tex文档外另需准备保存参考文献信息的bib文件(详见\ref{sec:bib:bibtex}节)。要进一步了解biblatex参考文献生成相关内容可以参考: biblatex宏包手册或者LaTeX 文档中文参考文献的biblatex解决方案
\footnote{地址:\url{https://github.com/hushidong/biblatex-solution-to-latex-bibliography}}。

\begin{codetex}{biblatex参考文献生成最小工作示例}{code:doc:structrue}
\documentclass{article}%文档类
%导言区开始:
%加载ctex宏包,中文支持
\usepackage{ctex}
%加载geometry宏包,定义版面
\usepackage[left=20mm,right=20mm,top=25mm, bottom=15mm]{geometry}
%加载hyperref宏包,使用超链接
\usepackage[colorlinks=true,pdfstartview=FitH,linkcolor=blue,anchorcolor=violet,citecolor=magenta]{hyperref}
%加载biblatex宏包,使用参考文献
%其中后端backend使用biber
%标注(引用)样式citestyle,著录样式bibstyle都采用gb7714-2015样式
\usepackage[backend=biber,bibstyle=gb7714-2015,%nature,%
citestyle=gb7714-2015%,backref=true%
]{biblatex}
%biblatex宏包的参考文献数据源加载方式
\addbibresource[location=local]{example.bib}

%正文区开始:
\begin{document}
%正文内容,引用参考文献
详见文献\cite{Peebles2001-100-100}\parencite{Miroslav2004--}
参考文献\cite[见][49页]{蔡敏2006--}\parencite[见][49页]{Miroslav2004--}

%打印参考文献表
\printbibliography[heading=bibliography,title=参考文献]
\end{document}
\end{codetex}


\subsection{gb7714-2015样式加载方式和选项说明}
\subsubsection{样式加载方式}
例\ref{code:doc:structrue}中给出了宏包和样式的基本加载方式,gb7714-2015样式类似。注意,当著录样式bibstyle和标注样式citestyle相同时,两者可以合并为一个选项style。比如:

\begin{codetex}{gb7714-2015顺序编码制加载方式}{eg:gb7714numeric}
\usepackage[backend=biber,bibstyle=gb7714-2015,citestyle=gb7714-2015]{biblatex}
%如果要设置参考文献表序号标签对齐方式的话请设置gbalign选项,如果要取消缺省出版项自动填补的话设置gbpub=false,比如:
\usepackage[backend=biber,style=gb7714-2015,gbalign=left,gbpub=true]{biblatex}
\end{codetex}

\begin{codetex}{gb7714-2015作者年制加载方式}{eg:gb7714authoryear}
\usepackage[backend=biber,style=gb7714-2015ay]{biblatex}
%如果要取消缺省出版项自动填补的话设置gbpub=false,如果要使用佚名或NOAUTHOR代替补充缺失的author信息可以设置gbnoauthor=true,比如:
\usepackage[backend=biber,style=gb7714-2015ay,gbpub=true,gbnoauthor=true]{biblatex}
\end{codetex}

\begin{codetex}{参考文献文本转换为bib文件perl脚本使用方式}{eg:transtobib}
perl gb7714texttobib.pl in=textfilename out=bibfilename
\end{codetex}

\subsubsection{增加的选项}\label{sec:added:opt}
gb7714-2015样式增加了部分用于控制标签对齐、出版项缺省处理、责任者(作者)缺省处理的选项,使用方式与biblatex宏包选项完全相同:
\begin{description}
  \item[gbalign]=right,left,gb7714-2015. \hfill default is right

  为顺序编码制增加的选项,用于选择参考文献表序号标签的对齐方式。gbalign=right 是默认的右对齐; gbalign=left是左对齐; gbalign=gb7714-2015是项对齐方式。对于作者年制该选项无效。测试结果见第\ref{sec:align:test}节

  \item[gbpub]=true,false. \hfill default is true

  为控制出版信息缺失处理增加的选项。默认选择gbpub=true,自动利用:[出版地不详],[出版者不详],[S.l.],[s.n.]等填补缺省信息; 设置gbpub=false 时,则取消自动处理,使用标准样式的方式取消相应项的输出。
  测试结果见第\ref{sec:opt:gbpub}节。

  \item[gbnoauthor]=true,false. \hfill default is false

  为作者年制增加的选项,用于控制责任者缺失时的处理。默认选择gbnoauthor=false,当作者信息缺失时不做处理,使用标准样式的处理方式; 设置gbnoauthor=true 时,则根据GB/T 7714-2015 的要求进行处理,中文文献使用佚名来代替author,英文文献用NOAUTHOR 来代替author。
  测试结果见第\ref{sec:opt:noauthor}节。

  \item[gbnamefmt]=uppercase,lowercase,none,pinyin. \hfill default is uppercase

  为姓名大小写格式控制增加的选项。默认选择gbnamefmt=uppercase,大小写要求符合GB/T 7714-2015 的要求。gbnamefmt=lowercase 时,大小写根据输入信息确定。gbnamefmt=none时,姓名的格式与biblatex标准样式一致。gbnamefmt=pinyin时,姓名的格式采用一种常用的中文拼音全拼方式,比如对于 Zhao, Yu Xin 或 Yu Xin Zhao 这个姓名拼音格式化为ZHAO Yu-xin。\emph{需要注意当使用pinyin选项时,姓名中应给出完整的名而不是名的缩写,否则出来的效果未必好看}。
  测试结果见第\ref{sec:opt:namefmt}节。

  \item[gbtype]=true,false. \hfill default is true

  为控制是否输出题名后面的文献类型和载体标识符而增加的选项。默认选择gbtype=true,根据GB/T 7714-2015 要求输出标识符,例如“在线的期刊析出文献题名[J/OL]”。而gbtype=false 时,不输出标识符,例如“在线的期刊析出文献题名”。
\end{description}


\subsubsection{与标准选项的兼容性}
绝大部分biblatex标准样式选项可与gb7714-2015样式联合使用,下面给出一些经过兼容性测试的选项说明。需要注意的是:使用gb7714-2015样式时(即style=gb7714-2015),backend选择应指定为biber,还有一些选项已经在样式设计中固定,不能修改设置。比如sorting,maxnames,minnames,date,useprefix,giveninits等。

\begin{description}
  \item[url]=true, false. \hfill default: true

  该选项控制是否打印 url 域并获取日期。该选项只影响 url 信息是可选的那些条目类型。而 @online 条目的 url 域总是会打印出来。它是导言区选项,与样式相关,gb7714-2015样式做了特别支持,可以兼容使用。

  \item[uniquelist]=true, false, minyear \hfill default: minyear

  该选项用于作者年制样式,用于正文中引用(标注)标签的作者列表控制(目的是消除歧义)。当uniquelist=true时,自动利用扩展作者姓名列表长度的方式消除labelname 列表的歧义; 当=false 时则禁用扩展,标签仅使用一个作者,消除歧义通过跟在年份后面的字母实现; 默认使用minyear,即当被截短的作者姓名列表存在歧义时,只有当年份相同,才会扩展列表长度以消除歧义。

  注意当使用uniquelist=false后标签只有一个作者,但文中可能有同姓作者的文献,这时根据uniquename选项的设置,biblatex会使用姓名的其它部分比如名来消除歧义,但如果想强制要求仅用姓作为文中的标注标签,那么可以设置uniquename=false,但此时标注是可能存在歧义的。

  \item[hyperref]=true, false, auto. \hfill default: auto

  是否将引用和后向引用转化为可点击的超链接。这是宏包的载入时选项,与样式无关,自然可以使用。

  \item[backref]=true, false. \hfill default: false

  是否在文献中打印出反向引用。这是宏包的载入时选项,与样式无关,自然可以使用。

  \item[refsection]=none, part, chapter, section, subsection. \hfill default: none

  该选项自动在文档分段处(例如一章或一节)开始一个新的参考文献分节。是宏包的载入时选项,与样式无关,自然可以使用。需要注意与titlesec宏包联用时,该选项会失效。

  \item[refsegment]=none, part, chapter, section, subsection. \hfill default: none

  类似于refsection选项,但开始的是一个新的参考文献片段。

  \item[citereset]=none, part, chapter, section, subsection. \hfill default: none

  该选项在文档分段处(例如一章或一节)自动执行citereset 命令。

  \item[labeldate]=year, short, long, terse, comp, ymd, edtf. \hfill default: year

  类似于 date 选项,但控制的是由DeclareLabeldate 选择的日期域的格式。

  \item[其它]=下面还有很多选项,有些是宏包载入时选项,与样式无关,一般可以使用,但笔者没有做测试,各位朋友可以测试使用。选项的作用可以参考biblatex 使用手册,以及笔者和Wenbo 翻译的中文版。
      \begin{itemize}
          \item related=true, false. default: true
          \item defernumbers=true, false default: false
          \item sortcites=true, false default: false
          \item maxitems=integer default: 3
          \item minitems=integer default: 1
          \item autocite=plain, inline, footnote, superscript, ...
          \item autopunct=true, false default: true
          \item language=autobib, autocite, auto,language default: autobib
          \item clearlang=true, false default: true
          \item autolang=none, hyphen, other, other*, langname default: none
          \item block=none, space, par, nbpar, ragged default: none
          \item notetype=foot+end, footonly, endonly default: foot+end
          \item indexing=true, false, cite, bib default: false
          \item backrefstyle=none, three, two, two+, three+, all+ default: three
          \item backrefsetstyle=setonly, memonly, setormem, setandmem, memandset, setplusmem default: setonly
          \item loadfiles=true, false default: false
          \item abbreviate=true, false default: true
          \item julian=true, false default: false
          \item punctfont=true, false default: false
          \item arxiv=abs, ps, pdf, format default: abs
          \item mincrossrefs=integer default: 2
          \item minxrefs=integer default: 2
          \item isbn=true, false default: true
          \item doi=true, false default: true
          \item eprint=true, false default: true
      \end{itemize}

\end{description}


\subsection{样式文件的进一步说明}

\subsubsection{关于参考文献数据源: bib文件的说明}\label{sec:bib:bibtex}

参考文献数据以bibtex格式保存在bib文件中。生成参考文献除tex源文档外,还需创建参考文献数据源文件即bib文件。bib文件数据源准备完成后,在加载biblatex宏包时,使用addbibresource命令将其加载进tex源文档中。\bc{注意:数据源可以加载多个,比如多个章节的参考文献放在不同的bib文件中,那么全部加载进来即可}。

bib文件中的参考文献信息是以条目形式组织,一篇文献创建一条记录即一个参考文献条目,一个条目由若干个数据域构成。文献的各部分信息应录入到条目的对应数据域中。GB/T 7714-2015标准中的文献类型与本样式中条目类型对应关系如表\ref{tab:entrytypes}所示,各类条目具体的著录格式详见\ref{sec:numeric:data}节。
\begin{table}[!htb]
\centering
\caption{常见条目类型}\label{tab:entrytypes}
\begin{tabular}{cl}
\hline
  GB/T 7714-2015标准中的参考文献类型 &  biblatex中的条目类型\\ \hline
  专著& book\\
  标准& standard/book or inbook with field note=standard\\
  专著中的析出文献& inbook\\
  连续出版物& periodical\\
  连续出版物的析出文献& article\\
  报纸析出的文献& newspaper/article with field note=standard\\
  专利& patent\\
  电子资源& online/www/electronic\\
  会议录或会议文集& proceedings\\
  会议文集中析出的文献& inproceedings/conference\\
  汇编或论文集& collection\\
  汇编或论文集析出中的文献& incollection\\
  学位论文& thesis/mastersthsis/phdthsis\\
  报告& report/techreport\\
  手册或档案& manual\\
  未出版物& unpublished\\ \hline
  \end{tabular}
\end{table}


组成各个条目的不同数据域(字段)保存有参考文献的各部分信息,比如作者、标题、出版项、日期等等,这些在标准中称为著录项目,
其对应关系如表\ref{tab:entryfields}所示。需要注意的是,note域在本样式中也做特殊用途,即在book类型的note域中输入standard表示标准,在aritcle类型的note域中输入news表示报纸,当然也可以不做特殊用,而只是表示杂项信息,因为标准和报纸可以用standard和newspaper类型表示,尽管这两种类型不是biblatex原生的条目类型。而usera域用于表示参考文献类型和载体标识符,一般不用出现在bib文件中,而由样式文件自动处理得到,这也为了使bib文件更纯粹,也为了兼容不同的样式,因为如果在bib文件中给出usera域,如果某一样式需要使用usera域且用途不同,那么就会有兼容性问题。当然不用手动输入这一信息也可以为用户减负,因为用户可以直接使用从网络导出参考文献信息而不用再额外添加一个参考文献类型和载体标识符。本宏包自动判断语言,而不使用一个表示语言的域比如language来标记文献的语言类型也处于同样的考虑,当然还有一篇文献中存在多语言的情况是无法用一个language标识的,比如一本英文著作被翻译为中文,那么原作者是英文,而译者则是英文,这时标记language就存在困难。

各个数据域的录入应符合bib文件规范。\bc{需要注意: 有时直接从网络获取的参考文献信息中可能带有一些特殊字符比如\%,\&等,这些字符在tex中通常需要做转义处理,本样式中对像title,journal等常见的域中出现的特殊字符已经做了转义,但是一些不常见的域比如abstract等没有考虑,所以用户需要手动处理,例如把\%改为\textbackslash \%,否则可能导致出错}。下面详细介绍本样式中使用的域及其数据录入方式:

\begin{table}[!htb]
\centering
\caption{常见信息域}\label{tab:entryfields}
\begin{tabular}{cl}
\hline
  GB/T 7714-2015中的文献著录项目 &  biblatex中的域\\ \hline
  责任者 & author\\
  题名 & title\\
  译者 & translator\\
  版本(主要用于出版物) & edition\\
  版本(主要用于软件和手册) & version\\
  出版地 & location/address\\
  出版者 & publisher\\
  出版者(大学和研究所) & institution/school\\
  出版者(会议主办方、手册和电子资源出品方) & organization\\
  日期 & date\\
  日期(不可解析的日期) & year\\
  页码 & pages\\
  析出文献来源的责任者 & bookauthor\\
  析出文献来源的标题 & booktitle\\
  连续出版物题名(期刊名) & journal/journaltitle\\
  期刊的卷 & volume\\
  期刊的期/专利号等 & number\\
  获取和访问路径 & url\\
  引用日期 & urldate\\
  数字对象标识符 & doi\\
  杂项 & note\\
  文献类型载体标识符 & usera\\
   \hline
  \end{tabular}
\end{table}

\begin{description}
  \item[author] 在biblatex中author域属于name数据类型,输入数据时,各姓名间用and 连接,当姓名过多省略时,用others代替。

      单个姓名,对于中文作者直接输入中文姓名即可。比如:于潇 and 刘义 and 柴跃廷 and others

      对于英文作者,单个姓名有两种biblatex可以解析的输入方式:

      \textcircled{1}prefix lastname, suffix, firstname middlename

      \textcircled{2}firstname middlename lastname or firstname prefix lastname

      对于需要输入前后缀的姓名只能采用第一种方式,比如:
      DES MARAIS, Jr., D J and H STRAUSS and SUMMONS, R. E. and others

      这里的第一个姓名输入为前缀,姓,后缀,名,中间名。第二个姓名输入为名,姓。第三个姓名输入为姓,名,中间名。

      \bc{需要强调:对于第二种输入方式,姓名各个组成部分最好首字母是大写的,首字母非大写可能导致解析出错,比如姓名只有两个组成部分firstname和lastname,如果firstname小写的话,有可能会解析为prefix lastname。对于第一种输入方式,则至少lastname需要首字母大写,否则有可能将lastname解析成prefix。其中lastname也称familyname,firstname middlename 两者共称givenname}

      对于机构作者,不需要解析,直接输入机构名,英文的各个机构名用\{\}包起来,比如:

      中国企业投资协会 and 台湾并购与私募股权协会 and 汇盈国际投资集团

      \{International Federation of Library Association and Institutions\}

  \item[title] 直接输入需要打印的内容,subtitle或titleaddon域类似
  \item[usera] 不用输入,自动处理
  \item[translator] 与author域类似,只是输入的是译者
  \item[edition] 直接输入整数,或者需要打印的内容
  \item[location] 直接输入需要打印的地址内容,而address域在biblatex中作为location别名,表示相同的内容。
  \item[publisher] 直接输入需要打印的出版者内容,institution,organization域类似
  \item[date] 日期可以格式化输入,格式化输入biblatex 会自动解析,如果无法解析会忽略该域。格式化的输入方式是:

      年-月-日/年-月-日

      比如:2001-05-06/2001-08-01

      其中第一个年-月-日会解析并存储到year,month,day域中,第二个会解析并存储到endyear,endmonth,endday域中。更多细节参考biblatex手册的Table 8: Date Interface。

  \item[year] year域的输入与date域类似,为了兼容一些老的bib文件,把year 直接用map 转换成date,所以在本样式的使用中输入year域与date域相同。

      但year与date存在一定的差异,即year可以处理仅有年的信息或者需要原样打印的内容。比如:
      1881(清光绪七年)。

      这一信息如果放在date中会被自动忽略,但放到year域中,本样式会先将其拷贝到date中进行解析,无法解析的话,date域忽略,但year 信息仍然存在,并原样打印。

  \item[pages] 可以格式化输入或输入需要打印的内容。格式化输入时,页码用整数,当有范围时,用短横线(使用多个短横线也没有问题)隔开。比如:59-60。 当无法解析时,输入内容被认为是需要完整打印的内容。
  \item[urldate] urldate域与date域类似,只是解析时,存储到urlday,urlmonth,urlyear,urlendday,urlendmonth,urlendyear域中。
  \item[url] 直接输入需要打印的网址内容
  \item[doi] 直接输入需要打印的DOI内容
  \item[note] 在本样式中note域有特殊功能,当其内容为standard或news 时,判断条目类型为标准和报纸析出的文献。
  \item[bookauthor] 用于析出文献时,作为析出文献来源文献的作者,其输入方式与author 相同。
  \item[booktitle] 用于析出文献时,作为析出文献来源文献的题名,其输入方式与title 相同。booktitleaddon域输入方式也相同。
  \item[volume] 连续出版物的卷,格式化输入用整数,当有范围时中间用短横线连接,比如:1-4。当无法解析时,输入内容被认为是需要完整打印的内容。
  \item[number] 连续出版物的期或报纸的版次,输入与volume类似。或者是专利等的号时,直接输入需要打印的内容。
  \item[journal] 用于连续出版物析出文献,表示连续出版物的题名,直接输入需要打印的内容。journaltitle,journalsubtitle域类似处理。
   \item[version] 用于report和manual的版本信息,直接输入需要打印的内容。
\end{description}

除了上述输入内容要求外,GB/T 7714-2015还有对数字、字母大小写等有一些格式要求,这些细节需要注意,请参考:
\begin{itemize}
\item 数字:\ref{sec:fmt:number}节
\item 字母大小写:\ref{sec:fmt:lettercase}节
\item 卷和期:\ref{sec:fmt:volnum}节
\item 版次:\ref{sec:fmt:edition}节
\item 出版项:\ref{sec:fmt:pubitem}节
\item 页码:\ref{sec:fmt:pages}节
\end{itemize}



\subsubsection{关于参考文献著录样式: bbx文件的说明}\label{sec:usage:bbx}
参考文献著录样式也称著录表样式或著录格式,主要分两类:顺序编码制和编码年制。
%顺序编码制的参考文献样式基于标准样式numeric-comp/numeric修改得到
顺序编码制样式中各条参考文献条目以数字序号按引用先后顺序组织。著录格式中序号格式见\ref{sec:bib:serialno}节,各类型文献条目的著录格式见\ref{sec:numeric:data}节,参考文献条目中各信息域及其录入方式见\ref{sec:bib:bibtex}节。

%作者年制的参考文献样式则基于标准样式authoryear修改。
作者年制样式中各条参考文献条目以作者-年为标签以一定的顺序排列。作者年制的著录格式与顺序编码制基本相同(除了把年份提到了作者后面作为文献条目内的标签)。数据源bib文件中各条目的数据录入与顺序编码制完全一致。

\qd{注意: 因为作者年制有分文种文献集中的要求,所以修改nyt排序格式,增加userb作为name前的排序域,默认情况下,本样式文件将作者为中文的文献的userb域设置成cn,英文的设置成en。这一设置过程,在biber处理时自动完成。当出现问题或者有更多文种分集且有特殊顺序时,可以为bib文件中给相应文种文献的userb域手动设置适合排序的字符串。比如: 中文文献设置为cn,英文文献设置为en,法文文献设置为fr,那么排序中,相应的中文文献排在最前面,英文文献在中间,法文文献最后,因为升序情况下字母顺序是c然后e然后f。}

%上一段2016-1114更新,下面是以前的说法。
%\qd{根据文种文献集中的要求,修改了nyt排序格式,增加了userb作为name前的排序域,当有需求进行多文种分集且有特殊顺序时,在bib文件中给相应文种的文献设置适合排序的字符串。比如中文文献设置为cn,英文文献设置为en,法文文献设置为fr,那么排序中,相应的中文文献排在最前面,英文文献在中间,法文文献最后,因为升序情况下字母顺序是c然后e然后f。}

\subsubsection{关于参考文献标注样式: cbx文件的说明}\label{sec:cbx:usage}
正文中的参考文献标注样式也称引用样式或引用标签样式,也分两类: 顺序编码制和作者年制。
%顺序编码制的标注样式文件大体使用标准引用样式numeric-comp的内容
顺序编码制的标注样式大体使用标准标注样式numeric,仅对cite等部分命令做了修改。为满足GB/T 7714-2015第10.1.3节的要求,增加了pagescite命令。为方便在同一文章中同时使用上标和非上标的标注方式,仅将cite命令修改为上标模式,而parencite保留标准样式提供的非上标模式。这些命令使用方式如下:

\begin{codetex}{顺序编码制cbx样式命令使用说明}{eg:citefornumeric}
不带页码的引用(上标,方括号包围):
    \cite{Peebles2001-100-100}
不带页码的引用(非上标,方括号包围):
    \parencite{Miroslav2004--}
带页码的引用:
    \cite[见][49页]{蔡敏2006--}  \parencite[见][49页]{Miroslav2004--}
    \pagescite{Peebles2001-100-100}  \pagescite[][201-301]{Peebles2001-100-100}
在页脚中引用和打印文献表:
    \footnote{在脚注中引用\footcite{赵学功2001--}}  \footfullcite{赵学功2001--}
\end{codetex}

其中,当不指定页码时,pagescite命令默认调用参考文献的页码数据进行输出,如果需要指定页码,那么需要在第二个[]内输入页码内容。

\qd{注意:对于多个文献一起的压缩形式,指定页码只会应用最后一个参考文献的页码,这是不正确的,但这种情况其实本不应出现,因为指定页码本来就需要具体化指某一文献。使用时请尽可能使用pagescite\{key1\}pagescite\{key2\}这种形式而不是pagescite\{key1,key2\}。}
%作者年制的标注样式文件大体使用标准引用样式authoryear的内容。
作者年制的标注样式情况类似。对cite,parencite进行了修改,将引用标签用圆括号括起来。为满足GB/T 7714-2015第10.2.4节的要求,增加了pagescite命令。为满足GB/T 7714-2015第10.2.1节的要求,增加了yearpagescite命令用于处理文中已有作者信息只需要年份和页码的情况(为兼容考虑,顺序编码制也给出该命令,但作用与pagescite命令相同)。使用方式如下:

\begin{codetex}{作者年制cbx样式命令使用说明}{eg:citeforauthoryear}
不带页码的引用:
    \cite{Peebles2001-100-100}  \parencite{Miroslav2004--}
带页码的引用:
    \cite[见][49页]{蔡敏2006--} \parencite[见][49页]{Miroslav2004--}
    \pagescite{Peebles2001-100-100} \pagescite[][201-301]{Peebles2001-100-100}
作者年制文中已有作者只需要年份和页码的情况,使用命令yearpagescite,比如:
    见赵耀东\yearpagescite[][205]{赵耀东1998--}和Simon\yearpagescite[][15]{Simon2001--}。

需要注意,\yearpagescite命令在输出年份的同时也输出页码,但有时有些参考文献格式不要求页码,此时可以用\yearcite命令,或者也可利用cite*和citeyear命令手动实现(如果要用超链接目前可以使用cite*),比如:
    见赵耀东\yearcite{赵耀东1998--}
    见赵耀东(\cite*{赵耀东1998--})
    见赵耀东(\citeyear{赵耀东1998--})
在页脚中引用和打印文献表:
    \footnote{在脚注中引用\footcite{赵学功2001--}} \footfullcite{赵学功2001--}
\end{codetex}

各引用命令的效果见\ref{sec:test:book},\ref{sec:cite:cmd:test}节。

\section{GB/T 7714-2015 标准说明与实现}

\subsection{顺序编码制}

\subsubsection{参考文献表}\label{sec:bib:serialno}

GB/T 7714-2015规定采用顺序编码制组织参考文献时,各篇文献应按正文部分标注的序号依次列出。具体参考GB/T 7714-2015第9.1节。

\subsubsection{文献标注法}
标注则根据在正文中引用的先后顺序连续编码,将序号置于方括号内。

同一处引用多篇文献,各篇序号间用逗号隔开,遇连续序号,起讫序号用短横线连接。

多次引用同一著者的同一文献时,可在序号的方括号外著录该文献引文页码,这一要求与引用(标注)样式无关,需要作者在写文档时使用相应的引用命令并在需要时输入页码信息。针对这一要求,在cite等常用命令基础上,新定义了一个引用命令pagescite,其使用方式详见第\ref{sec:cbx:usage}节。其标注效果见第\ref{sec:test:book}节。标注样式更详细要求参考GB/T 7714-2015 第10.1节。

如果顺序编码制采用脚注方式,则序号由计算机自动生成圈码。多次引用同一著者的同一文献时,若采用脚注方式应重复著录参考文献(这里可以理解为,采用该方式,同一文献的不同页码的引文就相当于一篇新的引文),只是在参考文献列表中可以简化(当然不进行简化,简单复制后录入对于latex的参考文献处理其实更方便)。事实上对于顺序编码用脚注方式,GB/T 7714-2015并没有详细说明脚注方式到底是什么?从举例看只是序号用类似于脚注的标签,那么对于参考文献样式来说,与非脚注方式的差别仅在于引用和参考文献条目的序号标签的差别,如此是容易通过修改样式文件得到的,但实际使用中除非有特殊要求,否则使用意义不大,因此本样式没有实现该功能。

\subsection{作者年制}

\subsubsection{参考文献表}

GB/T 7714-2015规定采用作者年制组织时,各篇文献首先按文种组织,可分为中文,日文,西文,俄文和其他文种等部分;然后按照著者字顺和出版年排列。中文文献可以按著者汉语拼音字顺排序,也可按笔画顺序排列。具体参考GB/T 7714-2015第9.2节。

%(因为需要根据语言进行划分,所以语言(language)域对于录入文献来说可能是必要的,因为作者的测试仅涉及中英文两种语言,没有遇到需要language域的情况。)

\subsubsection{文献标注法}
各篇文献的标注内容由著者姓(lastname)和出版年构成,并置于()内。对于使用汉字的语言来说,整个姓名都是lastname所以标注的是全名。机构团体名也整体标注。

若正文中已有著者姓名,则()内只标注出版年,这一点样式文件无法判断,只能是文档作者自身把握,当然样式文件提供了标签只有年份、附加年份和页码信息的引用命令yearpagescite,方便文档写作者使用,使用方法详见第\ref{sec:cbx:usage}节。

引用多个著者的文献时,对西文只需标注第一著者的姓(而在参考文献列表中的作者按最大数量三个处理,这与顺序编码制一致,参考GB/T 7714-2015第8.1.2节),其后附“et al.”,对于中文著者,标注第一著者的姓名,其后附“等”。姓名与“et al.”“等”间留适当空隙。

\bc{注意到在GB/T 7714-2015第10.2.1节给出的例子中作者姓的大小写格式与参考文献表中的要求是不同的,这说明标注中的作者姓名是由写文档的作者来决定的,因此本样式文件原样输出bib源文件中作者姓的大小格式}。

引用同一著者同一年出版的多篇文献时,出版年后应采用小写字符a,b,c等区别。

多次引用同一著者的同一文献,在正常标注外,需在()外以角标形式著录引文页码,这一问题样式文件无法判断,只能提供可以形成该格式的引用命令,供文档作者使用,因此提供pagescite命令,使用方法详见第\ref{sec:cbx:usage}节。

标注要求具体参考GB/T 7714-2015第10.2节。

\qd{注意:一般情况下,当文献作者缺省时,作者年制就没有作者可以用,因此文献题名用来生成标签,这样会导致文献表中文献题名后的文献类型标识/文献载体标识消失(这是因为题名用于生产标签后,题名域会被清除,自然也就不输出题名相关的信息了,见“\hyperlink{entrystdwithoutauthor}{Information and documentation-the Dublin core metadata element set}”)。但是可以用佚名替代缺省作者的方式避免这个问题,即可以使用样式文件提供的选项gbnoauthor=true,一旦设置该选项为true,则缺省的作者会根据文献语种填充为佚名或NOAUTHOR。默认情况下,不进行这种处理,即相当于设置选项gbnoauthor=false。而顺序编码制因为标签是数字序号,所以不存在这个问题。}

%本样式文件默认情况下采用佚名方式,如果不需要使用佚名,那么需要在样式文件中注释掉一段代码,这段代码在本文档末尾2016-11-14的更新历史中有说明,见\pageref{up:20161114}页。}

\subsection{各类文献在biblatex中对应的条目和域}\label{sec:numeric:data}
gb7714-2015.bbx是按照GB/T 7714-2015要求实现的biblatex参考文献著录样式文件。

根据GB/T 7714-2015要求并结合biblatex的条目类型和数据域,对各类参考文献做如下考虑:
\subsubsection{专著/book}
\begin{refentry}{}{}
专著对应的biblatex的entrytype为:book,文献类型标识用M表示。

\paragraph{其著录格式为}(参考GB/T 7714-2015第4.1节):\\
主要责任者.题名:其他题名信息[文献类型标识/文献载体标识].其他责任者.版本项.出版地:出版者,出版年:引文页码[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{专著/book条目的域格式}{eg:bookfieldfmt}
author.title[usera].translator.edition.location:publisher,date或year:pages[urldate].url.doi
\end{codetex}

其中标题相关的附加信息除了可以直接在title域中录入外,还可以在subtitle或titleaddon域中添加,后面出现的booktitle,journaltitle,也有类似情况,可以在booktitleaddon或者journalsubtitle中附加信息。其中出版地用location域表示,也可以用传统的address表示,biblatex将address作为location的别名处理,使用两者中的任何一个都可以表示出版地信息。\bc{特别强调:usera域不用录入,该域内容由bbx样式文件根据条目类型自动处理得到。}

\qd{注意:由于biblatex不支持standard条目类型,所以“标准”类型可以用book或inbook替代,但使用note域等于standard作为一个区分,当note域数据存在且内容等于standard时,就将其作为“标准”文献进行处理,其文献类型标识用S表示。这里为什么使用note域而不是type域和keywords域,是因为考虑到note域一般情况没有什么特殊意义,使用它不会导致冲突,而type域在biblatex标准样式中没有被book和article条目类型当作支持的域,对于支持该域的条目比如thesis,type域又有特殊的意义,是用来区分master和doctor的,而keywords域倒是可以使用,只是该域一般很少在jabref之类软件的默认域中,需要进一步设置,而且可能带来不通用的问题。}

\subsubsection{标准/standard}\label{sec:standard}
“标准”(standard)作为一种文献条目类型biblatex并不支持,因此可以如上一小节所述,直接利用book或inbook类型加note域代替。
或者使用本节下面给出的方式。

因为在一些bib文件中可能存在standard类型,为兼容性考虑,本样式实现了对standard条目类型的支持。著录格式的处理原理与前一节所述相同,只是利用动态数据将standard类型转换为book/inbook类型。因此在bib文件中可以直接使用standard类型,但要注意使用其它样式时可能存在移植障碍,因为其它样式可能不支持standard类型,为样式移植性考虑最好使用上一节的方式。

\begin{refentry}{}{}
标准对应的biblatex的entrytype为:standard。文献类型标识用S表示。

\paragraph{其著录格式为}(与book和inbook类型类似,其中圆括号内是与inbook类似时存在的内容,同时当出版地和出版者不存在时直接忽略,这是与book和inbook不同的地方。):\\
主要责任者.文献题名[文献类型标识/文献载体标识].其他责任者(//所在文献集主要责任者.文献集题名:其他题名信息).版本项.出版地:出版者,出版年:文献的页码[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{标准/standard条目的域格式}{eg:standardfieldfmt}
author.title[usera](//bookauthor.booktitle).edition.location:publisher,date或year:pages[urldate].url.doi
\end{codetex}


\subsubsection{专著中的析出文献/inbook}
\begin{refentry}{}{}
专著中的析出文献对应的biblatex的entrytype为:inbook。文献类型标识用M表示。

\paragraph{其著录格式为}(参考GB/T 7714-2015第4.2节):\\
析出文献主要责任者.析出文献题名[文献类型标识/文献载体标识].析出文献其他责任者//专著主要责任者.专著题名:其他题名信息.版本项.出版地:出版者,出版年:析出文献的页码[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{专著析出文献/inbook条目的域格式}{eg:inbookfieldfmt}
author.title[usera]//bookauthor.booktitle.edition.location:publisher,date或year:pages[urldate].url.doi
\end{codetex}

\subsubsection{连续出版物/periodical}
\begin{refentry}{}{}
连续出版物对应的biblatex的entrytype为:periodical。文献类型标识用J表示。

\paragraph{其著录格式为}(参考GB/T 7714-2015第4.3节):\\
主要责任者.题名:其他题名信息[文献类型标识/文献载体标识].年,卷(期)-年,卷(期).出版地:出版者,出版年[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{连续出版物/periodical条目的域格式}{eg:periodicalfieldfmt}
author/editor.title[usera].year或date,volume(number)-endyear, endvolume(endnumber).location:institution,date或year[urldate].url.doi
\end{codetex}

其中连续出版物的出版者用institution表示。
\bc{需要注意: 因为连续出版物可能用到两个日期,两个卷,两个期,所以录入数据时需要特别处理。不需要录入endyear等信息,只需要在到year或date域录入日期,由biber自动解析,两个日期之间用/分隔。而卷和期由于可能有合订模式,合订卷期之间用/分隔(参考GB/T 7714-2015第8.8.3节),因此如果需要解析有起止范围的卷和期,录入到volume和number域的信息中起止值之间应用-分隔}。

\subsubsection{连续出版物的析出文献/article}
\begin{refentry}{}{}%[break at=0.5cm/0pt]
连续出版物的析出文献对应的biblatex的entrytype为:article。文献类型标识用J表示。

\paragraph{其著录格式为}(参考GB/T 7714-2015第4.4节):\\
析出文献主要责任者.析出文献题名[文献类型标识/文献载体标识].连续出版物题名:其他题名信息,年,卷(期):页码[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{连续出版物析出文献/article条目的域格式}{eg:articlefieldfmt}
author.title[usera].journaltitle或journal,year,volume(number):pages[urldate].url.doi
\end{codetex}

\qd{需要注意:由于biblatex不支持newspaper 条目类型,所以条目类型报纸析出的文献用article表示,但使用note域等于news作为一个区分,当note域数据存在且内容等于news时,就将其作为报纸的析出文献进行处理。报纸文献类型标识用N表示,报纸的版次用number域描述。}

\subsubsection{报纸析出的文献/newspaper}\label{sec:standard}
biblatex没有将报纸的析出文献(newspaper)作为一种文献条目类型,因此可以如上一小节所述,直接利用article类型加note域代替。
或者使用本节下面给出的方式。

因为报纸析出的文献的文献标识码比较特殊不是J而是N,所以可以把报纸析出的文献独立出来进行处理。
为方便使用考虑,本样式增加了对一个全新的类型newspaper的支持,这种支持通过类似于standard类型的方式实现,没有对数据模型进行改动或增加,而完全利用动态数据修改将newspaper类型转换为article类型。因此在bib文件中可以直接使用newspaper类型,但要注意使用其它样式时可能存在移植障碍,因为其它样式可能不支持newspaper类型,为样式移植性考虑最好使用上一节的方式。

\begin{refentry}{}{}
报纸析出的文献对应一个新的entrytype为:newspaper。文献类型标识用N表示。

\paragraph{其著录格式为}(类似于article):\\
析出文献主要责任者.析出文献题名[文献类型标识/文献载体标识].报纸题名:其他题名信息,日期(版号)[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{报纸析出的文献/newspaper条目的域格式}{eg:newspaperfieldfmt}
author.title[usera].journaltitle或journal,date(number)[urldate].url.doi
\end{codetex}

\subsubsection{专利/patent}
\begin{refentry}{}{}%[break at=3cm/0pt]
专利文献对应的biblatex的entrytype为:patent。文献类型标识用P表示。

\paragraph{其著录格式为}(参考GB/T 7714-2015第4.5节):\\
专利申请者或所有者.专利题名:专利号[文献类型标识/文献载体标识].公告日期或公开日期[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{专利文献/patent条目的域格式}{eg:patentfieldfmt}
author.title:number[usera].date或year[urldate].url.doi
\end{codetex}

\subsubsection{电子资源/online}
\begin{refentry}{}{}%[break at=0.4cm/0pt]
电子资源对应的biblatex的entrytype为:online或electronic或者www。文献类型标识用EB表示。(注意:biblatex将electronic或www作为online条目类型的别名,对于标准样式来说这两者出现在bib文件中等同于online,但这种等同标准样式是在驱动层进行处理的,而gb7714样式还需要处理文献类型标识,本样式文件做了进一步支持。因此bib文件中也可以直接使用electronic和www)

\paragraph{其著录格式为}(参考GB/T 7714-2015第4.6节):\\
主要责任者.题名:其他题名信息[文献类型标识/文献载体标识].出版地:出版者,出版年:引文页码(更新或修改日期)[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{电子资源/online/electronic/www条目的域格式}{eg:onlinefieldfmt}
author.title[usera].organization,date或year:pages(date/enddate/eventdate)[urldate].url.doi
\end{codetex}

注意: 尽管GB/T 7714-2015中给出的著录格式包含出版地和出版者,但通常情况下具有出版地和出版者的文献会归类到其它条目类型中,至于存在的url信息,只要标识文献载体即可,即一般情况下(出版地:出版者,出版年:引文页码)这些信息很少出现在online[EB]条目中。因此默认情况下,gb7714-2015样式只处理出现organization中的出版项信息,此外用date表示更新或修改日期,urldate表示引用(访问)日期。如果出现复杂情况,更新或修改日期还可以利用enddate/eventdate表示。

以上是GB/T 7714-2015直接给出著录格式的条目类型,还有一些类型并没有给出具体格式,但在例子中也有所体现,本样式文件根据这些例子,给出了著录格式。

\subsubsection{汇编或论文集/collection}

\begin{refentry}{}{}
汇编文献对应的biblatex的entrytype为:collection。文献类型标识用G表示。

\paragraph{其著录格式为} 采用与book一致的格式。
\end{refentry}

\subsubsection{汇编或论文集析出中的文献/incollection}
\begin{refentry}{}{}
汇编中的析出文献对应的biblatex的entrytype为:incollection。文献类型标识用G表示。

\paragraph{其著录格式为} 采用与inbook一致的格式。
\end{refentry}

\subsubsection{会议录或会议文集/proceedings}
\begin{refentry}{}{}
会议文集的biblatex的entrytype为:proceedings。文献类型标识用C表示。

\paragraph{其著录格式为} 采用与book类似的格式。
\end{refentry}

\subsubsection{会议文集中析出的文献/inproceedings}
\begin{refentry}{}{}
会议文集中析出的文献对应的biblatex的entrytype为:inproceedings。文献类型标识用C表示。(注意:biblatex将conference作为inproceedings条目类型的别名,对于标准样式来说conference出现在bib文件中等同于inproceedings,但这种等同,标准样式是在驱动层进行处理的,而gb7714-2015样式还需要处理文献类型标识,本样式文件做了进一步支持。因此bib文件中也可以直接使用conference。)

\paragraph{其著录格式为} 采用与inbook类似的格式。
\end{refentry}

\subsubsection{学位论文/thesis}
\begin{refentry}{}{}
学位论文对应的biblatex的entrytype为:thesis。文献类型标识用D表示。(注意:biblatex将mastersthesis或phdthesis作为thesis条目类型的别名,对于标准样式来说这两者出现在bib文件中基本等同于thesis,但却会增加type信息。但这种等同,标准样式是在驱动层进行处理的,而gb7714-2015样式还需要处理文献类型标识并且不需要type信息,本样式文件做了进一步支持。因此bib文件中也可以使用mastersthesis和phdthesis)。

\paragraph{其著录格式为} 由biblatex的标准thesis格式修改得到。

主要责任者.题名:其他题名信息[文献类型标识/文献载体标识].其他责任者.出版地:出版者,出版年:引文页码[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{学位论文/thesis/mastersthesis/phdthesis条目的域格式}{eg:thesisfieldfmt}
author.title[usera].translator.location:institution,date或year:pages[urldate].url.doi
\end{codetex}

注意: thesis和后面report及manual的出版者用institution域表示,体现的是机构而不是一般的出版社。

\subsubsection{报告/report}
\begin{refentry}{}{}
报告对应的biblatex的entrytype为: report。文献类型标识用R表示。(注意:biblatex将techreport作为report条目类型的别名,对于标准样式,techreport出现在bib文件中等同于report,但这种等同标准样式是在驱动层处理的,而gb7714-2015样式还需要处理文献类型标识,本样式文件做了进一步支持。因此bib文件中也能直接使用techreport类型。)

\paragraph{其著录格式为} (由biblatex的标准report格式修改得到,注意当出版地和出版者不存在时忽略这两项)

主要责任者.题名:其他题名信息[文献类型标识/文献载体标识].其他责任者.类型.号码.版本项.出版地:出版者,出版年:引文页码[引用日期].获取和访问路径.数字对象唯一标识符.
\end{refentry}

其对应的biblatex数据域为:
\begin{codetex}{报告/report/techreport条目的域格式}{eg:reportfieldfmt}
author.title[usera].translator.type number.version.location:institution,date 或year:pages[urldate].url.doi
\end{codetex}

注意:因为有的报告文献可能存在类型和报告号信息,比如AIAA 9076或AD 730029等,所以著录格式需要有所体现,而这两个数据体现在type和number两个域中,或者在version域中体现也可,而对于标题中的出现的报告号,可以直接在标题或子标题或者附加标题中体现。
需要注意: report和后面manual的版本信息放在version域中,而不是book等条目的edition域中。

\subsubsection{手册或档案/manual}
\begin{refentry}{}{}
手册和档案采用一种格式,对应的biblatex的entrytype为:manual。文献类型标识用A表示。

\paragraph{其著录格式为} 直接采用report的格式,而不是标准样式中的manual格式,这种方式下,当没有出版地和出版者时,完全省略,因为GB/T 7714-2015并没有明确这种情况怎么处理。
\end{refentry}


\subsubsection{未出版物/unpublished}
\begin{refentry}{}{}
未出版物,对应的biblatex的entrytype为:unpublished。文献类型标识用Z表示。

\paragraph{其著录格式为} 也直接采用report格式处理。
\end{refentry}

\subsection{多语言文献}\label{sec:multilan:implement}

某些期刊对于参考文献有双语文献要求,那么可以通过条目集类型(set)/或者条目关联(related)来解决。具体要求见GB/T 7714-2015第6.1节。

\paragraph{利用条目集类型满足双语文献要求}

使用条目集类型(set)时,有静态和动态两种方法:
动态方法使用更为方便,在写文档时候,直接利用defbibentryset设置双语文献的set,然后引用set的bibtex键。比如:
\begin{codetex}{设置set条目集用于双语文献动态方法}{eg:setforbilangentry}
\defbibentryset{bilangyi2013}{易仕和2013--,Yi2013--}
专著,双语文献引用\cite{bilangyi2013}
\end{codetex}

得到的参考文献打印结果见\ref{sec:test:book}节的参考文献表。\bc{需要注意的是:因为set条目类型除了子条目关键词信息外,并无其他信息,因此它的标注标签通常会是空的。这个问题目前的解决方法是设置一个指定格式和内容中间无空格无英文逗号的关键字,用它来作为标签,这个问题与biblatex版本有关,v3.7及之前版本没有这个问题,因为set中还带有第一个子条目的信息,但v3.8及以上版本就不行了}。比如:
\begin{codetex}{设置set条目集用于双语文献动态方法}{eg:setforbilangentry}
\defbibentryset{易仕和,等,2013}{易仕和2013--,Yi2013--}
专著,双语文献引用\cite{易仕和,等,2013}
\end{codetex}
注意到“易仕和,等,2013”中的逗号是中文全角逗号,这样使得“易仕和,等,2013”以一个整体字符串当作关键字,而不会被分开解析。但是这种解决方案中的中文全角逗号与其它标签的英文逗号的差异使得该问题并没有完美解决。对于v3.8及以上版本,可以利用后面介绍的关联(related)方法来解决,或者也可以用静态方法手动添加标签来解决。

静态方法是在bib源文件中给出条目集(set)并使用biber后端进行解析,条目的域信息采用如下方法定义:
%当使用bibtex后端时,则需要进一步设置,具体参考biblatex宏包说明文档。
\begin{codetex}{设置set条目集用于双语文献静态方法}{eg:set:static}
@Set{set1,
entryset = {key1,key2,key3},
}
%如果要达到上例动态设置set一样的结果,在bib文件中静态设置set条目如下:
@Set{bilangyi2013,
entryset = {易仕和2013--,Yi2013--},
}
\end{codetex}

需要注意,使用静态条目集时,如果仅采用上述这般简单设置,中文排序会出现问题,条目集会出现在文献表末尾,这是因为条目集没有设置userb域用于排序,而通常的条目都是利用动态数据修改设置了userb域,在biber运行中因为要解析文献集,所以无法对userb域进行处理。但动态方法没有这一问题,因为其解析过程直接会利用第一个子条目的排序信息。静态方法的这个问题可以在set条目中手动设置userb域来修正。此外,对于v3.8以上版本的biblatex,无论动态方法还是静态方法,条目集不复制第一个子条目信息,因此引用时也无法生成标注标签,这就是前面介绍动态方法时讨论过的问题,该问题也可以通过在set条目中手动设置label域来解决。比如:

\begin{codetex}{在bib文件中正确设置set条目集的静态方法}{eg:set:staticright}
%在bib文件中静态设置set条目如下,其中:
%手动设置userb域用于解决排序问题
%手动设置label域用于解决标注标签问题
@Set{bilangyi2013,
entryset = {易仕和2013--,Yi2013--},
label={易仕和, 等, 2013},
userb={cn}
}
\end{codetex}

还要注意的是,\emph{动态set条目集等价于使用nocite命令,因此只要定义了动态条目集的文献都会出现在文献表中,因此如果不引用相应的文献,那么就不应该对其定义动态条目集}。

\paragraph{利用条目关联满足双语文献要求}

除上述给出的条目集方案外,关联条目方法则是另一种可行方案,该方案的讨论可以见“Again about the \@ set label for authoryear style”\footnote{https://github.com/plk/biblatex/issues/681}。该方案同样也有静态和动态两种方法,静态就是修改bib文件内容,动态则是在源文档中做设置。

静态方法很简单,bib文件中条目设置如例\ref{eg:related:staticright}所示,它能解决双语同时显示的问题,也能解决排序和标注标签问题,唯一的问题在于修改了bib文件后当不需要双语文献时,它还需要改回来,这会带来不便,因此可以考虑下面的动态方法,但要注意动态方法需要利用多个DeclareStyleSourcemap,因此该方法只适用于biblatex3.7及以上版本。

\begin{codetex}{在bib文件中正确设置关联条目的静态方法}{eg:related:staticright}
%在bib文件中静态设置条目如下,其中:
%易仕和2013--条目中增加了related域用于关联其对应的英文条目Yi2013--
@Book{易仕和2013--,
  Title                    = {超声速和高超声速喷管设计},
  Address                  = {北京},
  Author                   = {易仕和 and 赵玉新 and 何霖 and 张敏莉},
  Publisher                = {国防工业出版社},
  Year                     = {2013}
  related                  = {Yi2013--}
}
@Book{Yi2013--,
  Title                    = {Supersonic and hypersonic nozzle design},
  Address                  = {BeiJing},
  Author                   = {Yi, S H and Zhao, Y X and He, L and Zhang, M L},
  Publisher                = {National Defense Industry Press},
  Year                     = {2013}
}
\end{codetex}

动态方法利用动态数据修改自动添加related域,避免对bib文件做直接修改。本样式中对该过程进行了封装,定义一个新的命令defdoublelangentry,例如:
\begin{codetex}{设置关联条目的动态方法}{eg:related:dynamic}
\defdoublelangentry{易仕和2013--}{Yi2013--}
\end{codetex}

使用该命令后,可以引用主条目“易仕和2013--”生成双语文献。但要注意由于DeclareStyleSourcemap命令只能在导言区中使用,因此defdoublelangentry命令也只能出现在导言区中,这也是相比条目集动态方法的唯一遗憾。
实现的具体细节见\ref{sec:data:mdf:forrelated}节。

\subsection{标准的其它细节要求}

除了第\ref{sec:numeric:data}节针对不同条目类型的著录格式要求外,GB/T 7714-2015还有一些细节要求比如文字、符号等需要满足,可以采用如下方法:

\subsubsection{数字}\label{sec:fmt:number}

\begin{property}{}{}
用户给bib源文件录入数字时,应按照GB/T 7714-2015第6.2节要求用阿拉伯数字表示。
\end{property}

\subsubsection{英文字母}\label{sec:fmt:lettercase}

\begin{property}{}{}
为了符合西文文献责任者的字母大小写习惯,本bbx样式文件,通过判断是否存在first name来确定是否是个人作者,当存在first name 时认为是个人作者,不存在则是机构作者,当是个人作者时lastname按GB/T 7714-2015要求全大写,是机构作者则仅大写首字母。所以对于仅有lastname的个人作者,填入信息英文姓的字母请全用大写。个人著者的格式要求参考GB/T 7714-2015第6.3节。

用户给bib源文件录入出版项、西文期刊名缩写以及西文文献的字母时,应按照GB/T 7714-2015第6.4节,第6.5节,6.6节要求,使用符合要求的习惯用法和大小写方式。本样式文件使用原样打印的方式进行处理。

实际上,对于英文大小写问题,GB/T 7714-2015除了责任者的大写要求外,其它的要求相对比较模糊,所以一般不同的期刊会有各自不同的要求,比如不能使用缩写,而GB/T 7714-2015规定可参照ISO 4的要求等。从作者的经验看,一般国内的期刊对于字母大小写通常要求:
责任者(全部大写);题名(句首字母大写其它全部小写);期刊名会议名(单词首字母大写);出版项和其它(单词首字母大写)。所以在录入bib文件时可以按照这种常见方式来输入可以减少后期的修改。
\end{property}

\subsubsection{标点}

\begin{property}{}{}
用户给bib源文件录入引文信息时不需要考虑标点符号问题,只需录入各数据域的信息即可。

本样式文件实现了GB/T 7714-2015第7部分所给出的著录用符号要求。
\end{property}

\subsubsection{责任者}

\begin{property}{}{}
用户给bib源文件录入引文的责任者信息时,当责任者为多级机关团体时,用户填入auther数据信息时,应按照GB/T 7714-2015第8.1.4节要求,用英文句点.号分隔。

当责任者是个人英文名,且具有名、姓、前缀和后缀,应按照第\ref{sec:bib:bibtex}节给出姓名录入方式处理才能才能正确解析,比如:von Peebles, Jr., P. Z.,其中von为姓前的前缀,Jr.为姓后的后缀,P. Z.为缩写名(包括first name 和middle name)。

本样式文件实现了GB/T 7714-2015第8.1节要求的责任者样式,能自动判断责任者是中文还是英文,并分别处理。并且设置了全局选项useprefix=true,可以使用前缀。
\end{property}

\subsubsection{文献类型标识和载体}

\begin{property}{}{}
用户在给bib源文件录入引文题名信息时,不需要给出文献类型标识/文献载体标识。同一责任者的合订题名,应用户根据GB/T 7714-2015 第8.2.1节的要求,在多个题名间用英文分号分隔,并整体录入到title数据域中。而分卷号,卷次,册次等信息时,除了专利号用number域录入外,其它可以直接在title数据域或者subtitle/titleaddon等数据域中给出。

本样式文件实现了符合GB/T 7714-2015第8.2节要求的格式,能根据条目类型选择文献类型标识/文献载体标识,自动录入到自定义域usera中,并在各类参考文献条目驱动中直接使用。各不同类型文献的文献类型标识/文献载体标识,参考GB/T 7714-2015表B.1和B.2。
\end{property}

\subsubsection{版次}\label{sec:fmt:edition}

\begin{property}{}{}
用户在给bib源文件录入版次信息时,只要录入版次的整数数字或者录入需要打印的字符串。

本样式文件实现了GB/T 7714-2015第8.3节要求的格式,对于一般的版式格式,根据edition/version域输入的整数进行处理,其它特殊的版本说明,比如新1版,明刻本等直接在edition域录入后原样打印。
\end{property}

\subsubsection{出版项}\label{sec:fmt:pubitem}

\begin{property}{}{}
用户在给bib源文件录入出版项信息时,当出版日期有其它形式的纪年时,将其置于公元纪年后面的()内,并整体录入到 year 数据域中,比如: 1845(清同治四年)。而引用日期应录入到 urldate 数据域。当除了出版日期外还有修改/更新日期等时,可在year或date数据域录入第二个日期,并用/符号与前一个出版日期隔开。而专利的公告日期和其它条目类型的出版年应录入到 date 域中。

本样式文件实现了GB/T 7714-2015第8.4节要求的格式。当出版地和出版者缺省时,中英文自动区分处理。对于用/符号隔开的两个日期,biblatex后端biber能自动解析,后一个日期数据自动解析到endyear等域可作为修改日期等在样式文件中使用。
\end{property}

\subsubsection{页码}\label{sec:fmt:pages}
\begin{property}{}{}
用户在给bib源文件录入页码信息时,可以在pages域中根据需要录入可解析的页码(即用整数表示页码,起讫页码用-分隔),比如: 81-86。 也可以直接录入需要打印的信息,比如: 序2-3等。

本样式实现了GB/T 7714-2015第8.5,8.8.2节的要求,对于能解析的页码自动解析,对于不能解析的页码则原样输出。
\end{property}

\subsubsection{访问路径URL和DOI}
\begin{property}{}{}
用户在给bib源文件录入获取和访问路径、数字对象唯一标识符信息时,将访问路径录入到url域中,数字对象唯一标识符录入到doi域中即可。

本样式文件实现了GB/T 7714-2015第8.6,8.7节要求的格式。
\end{property}

\subsubsection{卷和期}\label{sec:fmt:volnum}
\begin{property}{}{}%[break at=0.4cm/0pt]
用户在给bib源文件录入卷、期等信息时,如\ref{sec:bib:bibtex}节中所述,合期的期号用/间隔,比如9/10,填入number域,报纸的版次也填入number域。

本样式文件实现了GB/T 7714-2015第8.8节要求的析出文献相关格式。
\end{property}




\section{参考文献著录格式测试}

\subsection{GB/T 7714-2015标准中的参考文献格式示例}\label{sec:eg:gb77142015}

\begin{refsection}
普通图书(book)
\cite{张伯伟2002--}
\cite{2009-155-155}
\cite{胡承正2010-112-112}
\cite{美国妇产科医师学会2010-38-39}
\cite{1962-50-50}
\cite{汪昂1881--}
\cite{蒋有绪1998--}
\cite{中国企业投资协会2013--}
\cite{罗斯基2009--}
\cite{库恩2012--}
\cite{候文顺2010-119-119}
\cite{CRAWFPRD1995--}
\cite{IFLAI1977--}
\cite{OBRIEN1994--}
\cite{Kinchy2012-50-50}
\cite{Praetzellis2011-13-13}

论文集(collection)、会议录(proceedings)
\cite{中国职工教育研究会1985--}
\cite{中国社会科学院台湾史研究中心2012--}
\cite{雷光春2012--}
\cite{陈志勇2011--}
\cite{Babu2014--}

报告(report)
\cite{中华人民共和国国务院新闻办公室2013-04-16--}
\cite{汤万金2013-09-30--}
\cite{Calkin2011-8-9}
\cite{DTFHA1990--}
\cite{WHO1970--}

学位论文(thesis)
\cite{马欢2011-27-27}
\cite{吴云芳2003--}
\cite{CALMS1965--}

专利文献(patent)
\cite{张凯军2012-04-05--}
\cite{河北绿洲生态环境科技有限公司2001--}
\cite{KOSEKI2002--}

标准文献(book,inbook,note=standard)
\cite{全国信息文献标准化技术委员会2010-3-3}
\cite{全国广播电视标准化技术委员会2007-1-1}
\cite{国家环境保护局科技标准司1996-2-3}
\cite{standardinfoiso158}

专著中析出的文献(inbook)
\cite{1988-590-590}
\cite{白书农1998-146-163}
\cite{汪学军2002-22-25}
\cite{国家标准局信息分类编码研究所1988-59-92}
\cite{1977-49-49}
\cite{楼梦麟2011-11-12}
\cite{BUSECK1980-117-211}
\cite{FOURNEY1971-17-38}

期刊中析出的文献(article)
\cite{杨洪升2013-56-75}
\cite{李炳穆2000-5-8}
\cite{于潇2012-1518-1523}
\cite{陈建军2010-93-93}
\cite{DESMARAIS1992-605-609}
\cite{Saito2006-169-176}
\cite{Walls2013-399-418}
\cite{Franz2013-1053-1062}
\cite{Park2010-696-715}

报纸中析出的文献(article,note=news)
\cite{丁文祥2000--}
\cite{张田勤2000--}
\cite{傅刚2000--}
\cite{刘裕国2013-01-12--}

电子资源(online)
\cite{萧钰2001--}
\cite{李强2012-05-03--}
\cite{Commonwealth--}
\cite{Dublin2012-06-14--}


\printbibliography[heading=subbibliography,type=book,notkeyword=standard,title=【A1-普通图书-著录格式示例】]%subbibintoc
\defbibfilter{collections}{%
type=collection
or type=proceedings
or type=incollection
or type=inproceedings
}
\printbibliography[heading=subbibliography,filter=collections,title=【A2-论文集、会议录-著录格式示例】]
\printbibliography[heading=subbibliography,type=report,title=【A3-报告-著录格式示例】]
\printbibliography[heading=subbibliography,type=thesis,title=【A4-学位论文-著录格式示例】]
\printbibliography[heading=subbibliography,type=patent,title=【A5-专利-著录格式示例】]
\defbibfilter{standard}{%
( type=book or type=inbook )
and keyword=standard
}
\printbibliography[heading=subbibliography,filter=standard,title=【A6-标准文献-著录格式示例】]
\hypertarget{entrystdwithoutauthor}{注意:这里最后一篇标准文献没有责任者,所以作者年制默认情况下无法给出文献标识符。}
\printbibliography[heading=subbibliography,type=inbook,notkeyword=standard,title=【A7-专著中析出的文献-著录格式示例】]
\printbibliography[heading=subbibliography,type=article,notkeyword=news,title=【A8-期刊中析出的文献-著录格式示例】]
\printbibliography[heading=subbibliography,keyword=news,title=【A9-报纸析出的文献-著录格式示例】]%type=article,有时type是newspaper所以不指定type为article
\printbibliography[heading=subbibliography,type=online,title=【A10-电子资源-著录格式示例】]
\end{refsection}

\subsection{测试:专著book和专著中的析出文献inbook及标准standard文献}\label{sec:test:book}

专著book和专著中的析出文献inbook及标准standard文献测试,参见:

顺序编码制:
\href{run:./example/egbooks.tex}{egbooks.tex},
\href{run:./example/egbooks.pdf}{egbooks.pdf}。

作者年制:
\href{run:./example/egbooksay.tex}{egbooksay.tex},
\href{run:./example/egbooksay.pdf}{egbooksay.pdf}。


\subsection{测试:连续出版物periodical和连续出版物中的析出文献article}
连续出版物periodical和连续出版物中的析出文献article文献测试,参见:

顺序编码制:
\href{run:./example/egjournal.tex}{egjournal.tex},
\href{run:./example/egjournal.pdf}{egjournal.pdf}。

作者年制:
\href{run:./example/egjournalay.tex}{egjournalay.tex},
\href{run:./example/egjournalay.pdf}{egjournalay.pdf}。

\subsection{测试:电子资源或在线资源online}
在线资源online文献测试,参见:

顺序编码制:
\href{run:./example/egonline.tex}{egonline.tex},
\href{run:./example/egonline.pdf}{egonline.pdf}。

作者年制:
\href{run:./example/egonlineay.tex}{egonlineay.tex},
\href{run:./example/egonlineay.pdf}{egonlineay.pdf}。

\qd{注意:对于作者年制,这里有4篇文献都是noauthor,有两篇有年份可以轻易分开,还有两篇没有年份存在歧义,所以在标注中用了[n.d.]加a和b分开,但在参考文献表中,各个版本的biblatex表现是不同的,其中3.4版因为进行newbibmacro*\{date+extrayear\}的定义时候,首先判断iffieldundef\{\textbackslash thefield\{datelabelsource\}year\},当不存在datelabelsource的值+year的域时,就不再添加了。如果需要加extrayear也可以修改出来,但其实并无必要。这与标注中用的newbibmacro*\{cite:labelyear+extrayear\}(在authoryear.cbx文件中)的定义是不一样的。更多的内容详见
\ref{sec:dateinlabel}节。\par}


\subsection{测试:学位论文thesis、专利文献patent}
学位论文thesis文献专利文献patent文献测试,参见:

顺序编码制:
\href{run:./example/egthesispatent.tex}{egthesispatent.tex},
\href{run:./example/egthesispatent.pdf}{egthesispatent.pdf}。

作者年制:
\href{run:./example/egthesispatentay.tex}{egthesispatentay.tex},
\href{run:./example/egthesispatentay.pdf}{egthesispatentay.pdf}。

\qd{注意:专利文献\{刘加林1993--\}的location定义了中国,GB/T 7714-2015中其实并不需要该域,但这里并没有去掉,先放着也许以后标准修改后可能用的着。如果要去掉,那么将bib文件中该条目的location去掉就行了。}


\subsection{测试:报告report、手册manual和档案、未出版物unpublished}
报告report、手册manual和档案、未出版物unpublished文献测试,参见:

顺序编码制:
\href{run:./example/egreport.tex}{egreport.tex},
\href{run:./example/egreport.pdf}{egreport.pdf}。

作者年制:
\href{run:./example/egreportay.tex}{egreportay.tex},
\href{run:./example/egreportay.pdf}{egreportay.pdf}。


\subsection{测试:会议文集proceedings和会议文集中析出的文献inproceedings及汇编collection和汇编中的析出文献incollection}

proceedings和inproceedings及collection和incollection文献测试,参见:

顺序编码制:
\href{run:./example/egprcdorinprcd.tex}{egprcdorinprcd.tex},
\href{run:./example/egprcdorinprcd.pdf}{egprcdorinprcd.pdf}。

作者年制:
\href{run:./example/egprcdorinprcday.tex}{egprcdorinprcday.tex},
\href{run:./example/egprcdorinprcday.pdf}{egprcdorinprcday.pdf}。

\subsection{测试: 双语文献}\label{sec:doublelang:test}

双语文献的两种实现方法,一是基于set的动态方法,二是基于related的动态方法,参见:
\href{run:./example/egaligngb7714-2015ay.tex}{egaligngb7714-2015ay.tex},
\href{run:./example/egaligngb7714-2015ay.pdf}{egaligngb7714-2015ay.pdf}。

\subsection{测试: gbalign选项}\label{sec:align:test}
gbalign选项主要控制顺序编码制序号标签三种对齐方式,
分别是:

右对齐,参见:
\href{run:./example/egalignright.tex}{egalignright.tex},
\href{run:./example/egalignright.pdf}{egalignright.pdf}。

左对齐,参见:
\href{run:./example/egalignleft.tex}{egalignleft.tex},
\href{run:./example/egalignleft.pdf}{egalignleft.pdf}。

项对齐,参见:
\href{run:./example/egaligngb7714-2015.tex}{egaligngb7714-2015.tex},
\href{run:./example/egaligngb7714-2015.pdf}{egaligngb7714-2015.pdf}。

\subsection{测试: gbpub选项}\label{sec:opt:gbpub}
gbpub选项测试参见:

顺序编码制(作者年制类似):

\href{run:./example/eggbpubtrue.tex}{eggbpubtrue.tex},
\href{run:./example/eggbpubtrue.pdf}{eggbpubtrue.pdf}。

\href{run:./example/eggbpubfalse.tex}{eggbpubfalse.tex},
\href{run:./example/eggbpubfalse.pdf}{eggbpubfalse.pdf}。


\subsection{测试: gbnoauthor选项和online条目仅存url信息}
\label{sec:opt:noauthor}
online条目信息严重缺失问题测试参见:

\href{run:./example/eggbnoauthortrue.tex}{eggbnoauthortrue.tex},
\href{run:./example/eggbnoauthortrue.pdf}{eggbnoauthortrue.pdf}。

\href{run:./example/eggbnoauthorfalse.tex}{eggbnoauthorfalse.tex},
\href{run:./example/eggbnoauthorfalse.pdf}{eggbnoauthorfalse.pdf}。

gbnoauthor选项测试参见:

\href{run:./example/eggbnoauthortrueay.tex}{eggbnoauthortrueay.tex},
\href{run:./example/eggbnoauthortrueay.pdf}{eggbnoauthortrueay.pdf}。

\href{run:./example/eggbnoauthorfalseay.tex}{eggbnoauthorfalseay.tex},
\href{run:./example/eggbnoauthorfalseay.pdf}{eggbnoauthorfalseay.pdf}。

\subsection{测试: gbnamefmt选项}
\label{sec:opt:namefmt}
姓名默认情况下字母大写的,即 gbnamefmt=uppercase,设置 gbnamefmt=lowercase 可以不处理保持原始的大小写,设置 gbnamefmt=none 则使用 biblatex标准样式的处理方式,参见:

gbnamefmt=lowercase 情况:
\href{run:./example/eggbnamefmta.tex}{eggbnamefmta.tex},
\href{run:./example/eggbnamefmta.pdf}{eggbnamefmta.pdf}。

gbnamefmt=none 情况:
\href{run:./example/eggbnamefmtb.tex}{eggbnamefmtb.tex},
\href{run:./example/eggbnamefmtb.pdf}{eggbnamefmtb.pdf}。

\subsection{测试: beamer类}

beamer类中的参考文献测试,参见:

顺序编码制:
\href{run:./example/egbeamer.tex}{egbeamer.tex},
\href{run:./example/egbeamer.pdf}{egbeamer.pdf}。

作者年制:
\href{run:./example/egbeameray.tex}{egbeameray.tex},
\href{run:./example/egbeameray.pdf}{egbeameray.pdf}。

\subsection{测试: 上标和非上标等不同的标注格式}\label{sec:cite:cmd:test}
\begin{refsection}
不带页码的引用(顺序编码制上标,方括号包围;作者年制行内,括号包围):
\begin{itemize}
  \item 见文献\cite{Peebles2001-100-100}。
\end{itemize}

不带页码的引用(顺序编码制非上标,方括号包围;作者年制行内,括号包围):
\begin{itemize}
  \item 在文献\parencite{Miroslav2004--}中。
\end{itemize}

带页码的引用(标准命令,默认样式; 增加命令,GB/T 7714-2015样式):
\begin{itemize}
  \item \cite[见][49页]{蔡敏2006--}\parencite[见][49页]{Miroslav2004--}。
  \item \pagescite{Peebles2001-100-100}\pagescite[][201-301]{Peebles2001-100-100}
\end{itemize}

已有作者只需要年份和页码的情况(命令yearpagescite),作者年制(上标),顺序编码制(与pagescite作用相同);
已有作者只需要年份的情况(命令yearcite):
\begin{itemize}
  \item 见赵耀东\yearpagescite[][205]{赵耀东1998--}和Simon\yearpagescite[][15]{Simon2001--}的文献。
  \item 见赵耀东\yearcite{赵耀东1998--}
  \item 见赵耀东(\cite*{赵耀东1998--})
  \item 见赵耀东(\citeyear{赵耀东1998--})
\end{itemize}

\printbibliography[heading=subbibliography,title=【gb7714-2015顺序编码制上标和非上标标注测试】]
\end{refsection}

\subsection{测试: phdthsis等条目类型的兼容性}\label{sec:entrytype:compatibility}
\begin{refsection}
测试某些bib文件给出的mastersthsis,phdthsis,www,electronic,standard,techreport,conference条目类型,测试本样式增加的newspaper类型。
\begin{itemize}
  \item newspaper:\cite{张田勤2000--}
  \item standard:\cite{全国文献工作标准化委员会第七分委员会1986--,国家标准局信息分类编码研究所1988-59-92}
  \item conference:\cite{Li2004-21-24}
  \item www:\cite{萧钰2001--}
  \item electronic:\cite{OMG2003--}
  \item techreport:\cite{Humphrey1971--}
  \item mastersthsis:\cite{张志祥1998--}
  \item phdthsis:\cite{张若凌2004--}
\end{itemize}

\printbibliography[heading=subbibliography,title=【兼容phdthsis等条目类型】]
\end{refsection}

\subsection{测试: 当责任者等需要判断中英文的信息中存在编组时的处理}
\begin{refsection}
当责任者等需要判断中英文的信息中存在编组时的处理\cite{IFLAI1977b--,IFLAI1977--}
\cite{r27-BenHadjAlaya-FekiA.2008-1-5,中国企业投资协会2014--,中国企业投资协会2015--}

\printbibliography[heading=subbibliography,title=【中英文判断信息中存在编组的测试】]
\end{refsection}



\subsection{测试: 处理参考文献信息中\&等特殊字符}\label{sec:entrytype:compatibility}
\begin{refsection}
文献中\cite{ref-replace-char}的booktitle域中含有\%,\&,\#符号,样式文件自动处理使其符合tex代码规则。
\printbibliography[heading=subbibliography,title=【处理参考文献信息中\&等特殊字符】]
\end{refsection}

\subsection{测试: 处理作者年制article中卷信息缺省的标点}\label{sec:article:novol}
\begin{refsection}
文献\cite{刘彻东1998-38-39}\cite{亚洲地质图编目组1978-194-208}
\cite{高光明1998-60-65}

\printbibliography[heading=subbibliography,title=【author-year style:article without volume】]
\end{refsection}

\subsection{测试: 标题中有\textbackslash LaTeX\{\}等名称时的情况}\label{sec:with:latex}
\begin{refsection}
文献\cite{Peebles2001-100-100}\cite{赵凯华1995--}\cite{蒋有绪1998--}

\printbibliography[heading=subbibliography,title=【title with \textbackslash LaTeX\{\}】]
\end{refsection}




\section{样式文件设计、实现、应用}\label{sec:biblatex:mech}
biblatex相当完善和强大,笔者开发样式文件过程中仅使用了biblatex提供的一小部分功能,更多功能其实都没有涉及到。可以说,biblatex作为参考文献问题的一个完整解决方案是名副其实的。笔者在设计样式文件时应用biblatex宏包功能的思路和实现总结如下:

\subsection{基本思路}

考虑到我国引用参考文献通常是中英文混合的情况,因此不考虑针对中文的本地化处理,而是在英文本地化的基础(英文的本地化字符串设置文档是english.lbx)上添加一些中文要求的本地化字符串来使用。而为了区分使用中英文的字符串,对参考文献条目中数据域内容进行中英文判断,若是中文则使用中文字符串,若是英文则使用英文字符串。

这里的中英文判断主要是在tex中的判断,利用对域中的信息进行检测,当信息的第一个字符是CJK字符时,判断该域的信息是中文的,否则是英文的。

在作者年制中不同语种文献分集时也有一个中英文判断,主要是利用动态数据修改的方法。利用perl正则表达式判断作者和标题域中是否有中文信息(可以用排除法即匹配不是英文数字标点的字符通常是中文字符,当然最直接的是用unicode的中文字符范围匹配),有的话设置cn,否则为en。事实上这种判断可以进一步扩展,利用强大的perl正则表达式,对所有的关键域进行判断,并在一些域中设置标识,用于tex输出时进行判断,而避免直接使用上述CJK字符判断函数。

\subsection{利用字符流解析或者xstring宏包的函数}\label{sec:cjkjudge}
\begin{enumerate}
\item cjk字符判断
\begin{texlist}
%定义判断中文字符的函数,用于判断作者等信息是否由中文字符构成
%2E00-2E7F 追加标点
%2E80-2EFF cjk部首补充
%2FF0-2FFF 表意文字描述符
%3000-303F cjk符号和标点
%3300-33FF cjk兼容
%3400-4DBF cjk统一表意符号扩展
%4E00-9FBF cjk统一表意符号
%中文范围4E00-9FA5
\providetoggle{ifCJKforgbt}
\def\testCJKfirstchar#1#2&{%
\ifnumgreater{`#1}{"2E7F}{\toggletrue{ifCJKforgbt}}{\togglefalse{ifCJKforgbt}}%
}%

%利用edef展开或xstring抽取第一个字符判断
%现在采用xstring方法,避免抽取的是编组符号
\def\testCJKfirst#1{%
%\edef\tempa{#1}%可以替换下面两句,但失去忽略多余编组功能
\exploregroups%
\StrChar{#1}{1}[\tempa]%
\expandafter\testCJKfirstchar\tempa&}
\end{texlist}

\item 卷期范围解析
\begin{texlist}
%用于解析连续出版物,2个卷期的情况
%\def\multivolumeparsetoparts#1/#2{\def\multivolumefirst{#1}\def\multivolumesecond{#2}}
%\def\multinumberparsetoparts#1/#2{\def\multinumberfirst{#1}\def\multinumbersecond{#2}}
%范围起止间隔符号还是用-,而不是与date相同的/,因为有合期期刊的问题,需要用到/符号
\newcommand{\multivolparser}[1]{%
    \IfSubStr{#1}{-}%
        {\StrBefore{#1}{-}[\multivolfirst]\StrBehind{#1}{-}[\multivolsecond]}%
        {\def\multivolfirst{#1}\def\multivolsecond{}}%
}

\newcommand{\multinumberparser}[1]{%
    \IfSubStr{#1}{-}%
        {\StrBefore{#1}{-}[\multinumberfirst]\StrBehind{#1}{-}[\multinumbersecond]}%
        {\def\multinumberfirst{#1}\def\multinumbersecond{}}%
}

%这里利用李志奇的范围数据解析函数,修改后用来处理卷volume的范围。
%他的这个函数是通用的,只能在使用数据前使用,如果多次使用前一次得到的数据就会被冲掉
%这里的范围起止判断符号还是用-,而不是与date相同的/,因为有合期期刊的问题,需要用到/符号
%\def\gbt@parse@range#1{%
%    \edef\gbt@tmpa{#1}%
%    \expandafter\gbt@parse@rangei\gbt@tmpa-\@empty}
%\def\gbt@parse@rangei#1-#2\@empty{%
%    \global\def\gbt@range@first{#1}%
%    \def\gbt@tmpa{#2}%
%    \ifx\gbt@tmpa\@empty%
%        \global\def\gbt@range@second{}%
%    \else%
%        \gbt@parse@rangeii#2\@empty%
%    \fi}
%\def\gbt@parse@rangeii#1-#2\@empty{%
%    \def\gbt@tmpa{#2}%
%    \ifx\gbt@tmpa\@empty%
%        \global\def\gbt@range@second{#1}%
%    \else%
%        \gbt@parse@rangeii#2\@empty%
%    \fi}

%这里写的number的解析函数,与上面的卷解析函数是类似的。
%\def\multinumberparser#1{%
%    \edef\gbnumbertmp{#1}%
%    \expandafter\multinumberparsetoparts\gbnumbertmp-\@empty}
%\def\multinumberparsetoparts#1-#2\@empty{%
%    \def\multinumberfirst{#1}%
%    \def\gbnumbertmp{#2}%
%    \ifx\gbnumbertmp\@empty%
%        \def\multinumbersecond{}%
%    \else%
%        \multinumberparsetopartsb#2\@empty%
%    \fi}
%\def\multinumberparsetopartsb#1-#2\@empty{%
%    \def\gbnumbertmp{#2}%
%    \ifx\gbnumbertmp\@empty%
%        \def\multinumbersecond{#1}%
%    \else%
%        \multinumberparsetopartsb#2\@empty%
%    \fi}
\end{texlist}

\end{enumerate}

\subsection{标点和空格的特点和机制}
  \begin{enumerate}
    \item 标点符号设置比如:renewrobustcmd*\{\textbackslash bibinitperiod\}\{\} 和renewcommand*\{\textbackslash revsdnamepunct\}\{\}等用于全局修改标点。
    \item 如isdot/adddot,adddot将原样(逐字,如实)句点转换为缩写点在有利用printtext输入原样字符的时候很重要比如[s.n.] 中,比如title末尾。
    \item 利用newunit输出的标点,需要后面遇到printfield等命令有内容才输出标点,这是标点的异步处理机制。
    \item setunit*的作用是前面printtext等没有输出时候就不输出,见4.11.7.3 节的应用以及出版项缺省时的代码处理。
    \item 标点和空格的调试方法:有时引入多余的空格和标点后很难快速处理,那么需要调试,调试的第一步是注释掉多余的代码,实现无多余空格或标点情况(一种快速方法是直接在一个printtext输出各相关域),然后一步步恢复原来的代码,直到找到多余空格或标点产生的原因,最后根据原因作出修改。
    \item 多余空格的引入,可能来自于如下方面(下面是已经遇到的,可能还有更多)
    \begin{itemize}
    \item 行末空格引入,解决方法:把相关的代码行结尾用\%符号注释。
    \item mkbibparens等命令引入,解决方法:利用printtext\{(\},printtext\{)\}来代替
    \item nopunct等命令引入,这种引入的空格使用unspace命令还消除不了,解决方法:避免使用nopunct命令,而在标点设置时多做判断,只有有内容时才设置标点,而不是过分依赖biblatex提供的标点异步处理机制。
    \end{itemize}

    \item 短横线相关的字符,参考: unicode 表

        \begin{itemize}
        \item 0x2d:hyphen :\char"2D,直接输入键盘短横线得到\verb|-|,即为连字符
        \item 0x2010:hyphen :\char"2010
        \item 0x2011:non breaking hyphen :\char"2011
        \item 0x2012:figure dash :\char"2012
        \item 0x2013:en dash :\char"2013,直接输入两个键盘短横线得到\verb|--|
        \item 0x2014:em dash :\char"2014,中文全角的一段破折号线,可以用三个短横线得到\verb|---|
        \item 0x2212:mathematical minus :\char"2212
        \end{itemize}
        biblatex中页码范围中的间隔符是\verb|\bibrangedash|,默认则是en dash。可以通过设置如下命令做修改:
        \begin{texlist}
        \DefineBibliographyExtras{english}{\renewcommand*{\bibrangedash}{-}}% 将页码间隔符替换为hypen连字符
        \end{texlist}
        而日期成分之间的间隔符则是\verb|\bibdatesep|,默认是hyphen,即连字符。

    \item 使用printtext等命令确保异步处理机制不被破坏,典型的例子为,专利的公告日期(对于3.7以上版本)使用了biblatex的内容宏,但还需要将其用printtext包围起来,比如:
        \begin{texlist}
        %
        %   专利的公告日期、或报纸的日期的输出宏
        %   20160701,v1.0,新增加
        %   20180405,为biblatexv3.10版本,出现多出点bug做处理,Hu Zhenzhen
        %
        %   原理方法:加上printtext避免破坏异步标点机制
        %
        \newbibmacro*{newsdate}{%%
        \printtext{\blx@isodate{}{}}%%
        }
        \end{texlist}

    \item beamer中标题后面的标点情况,beamer对bibmacro\{title\}做了patch以实现特殊的效果。比如:
    \begin{texlist}
    \pretocmd{\abx@macro@title}
       {\ifcsundef{abx@name@labelname}{}{\let\bbx@tempa\labelnamepunct}%
        \bbx@tempa\newblock\unspace\usebeamercolor[fg]{bibliography entry title}}{}{}
    \apptocmd{\abx@macro@title}
       {\ifcsundef{abx@field@title}{}{\ifpunct{}{\midsentence\newunitpunct}}
        \newblock\unspace\usebeamercolor[fg]{bibliography entry note}}{}{}
    \end{texlist}
    该patch详见beamerbaselocalstructure.sty文件。需要注意\verb|abx@field@title|,在biblatex中是有newbibmacro\{title\}产生的。注意到在apptocmd做的patch中,midsentence命令隐藏了其前面的标点并重新做标点最终,因此其后的newunitpunct命令必将输出标点,因此无论如何标题后面必然会出现一个newunitpunct控制的标点,这个标点一般情况下是可以用的,但是对于有些文献类型比如inbook,析出文献标题后面没有标点只有//,因此需要将该标点去掉,所以需要反处理该patch。
    通过测试表明,无论是在title前再做pretocmd或者在title后再做apptocmd 都会产生问题,多个的apptocmd的机制大体是前一个做完后,后一个在其基础上处理,而apptocmd主要做的是封装,因此前一个产生的效果无法消除。但通过思考发现,使用patchcmd 可以对前面的效果产生影响,它不是封装而是一种替换,所以可以将前面封装的效果去掉。比如:
    \begin{texlist}
    %
    %   文献标题后的标点问题
    %   20180405,v1.0k,为texlive2017以上版本中的beamer兼容性做的处理,Hu Zhenzhen
    %
    %   原理方法:如下代码处理texlive2017以上版本中,beamer中文献的标题后出现两个点的情况:
    %   texlive2017以上的beamer中对macro{title}做了patch,正常情况下不会出现两个点的情况,但由于
    %   之前为了处理texlive2015,2016下的title格式添加了adddot,导致出现两个点的情况,而且也影响
    %   析出文献的//符号的输出,因此再次对macro{title}做patch消除beamer中做apptocmd时添加的\newunitpunct
    \ifboolexpr{%
        test{\iftoggle{iftlfive}}
        or
        test{\iftoggle{iftlsix}}
      }{}%
      {%texlive 2017对应iftlseven以上版本
      \DeclareFieldFormat{title}{#1}%
      \DeclareFieldFormat[article,patent,thesis,unpublished]{title}{#1}
      \AtBeginDocument{%
      \@ifclassloaded{beamer}
        {\patchcmd{\abx@macro@title}{\newunitpunct}{}{}{}}{}}
      }
    \end{texlist}

  \end{enumerate}


\subsection{动态数据修改}
利用biber在处理数据源时的动态处理,可以处理一些数据,比如设置一些域的值,用于进一步的判断和应用。

\subsubsection{基本原理和方法}\label{sec:dynamic:modify}
biber动态数据处理,详见biblatex说明文档Dynamic Modification of Data一节和bbx文件中DeclareSourcemap的内容。
  \begin{enumerate}
    \item map的作用,对条目逐条进行处理
    \item final作用,当不成立map终止。
    \item append的作用,给域添加信息
    \item origfieldvalue来源
    \item overwite选项有无的作用,无overwite时,只要域原有信息,那么就不再map,有overwite时,则进行覆盖。\bc{注意:使用append的时候也需要overwite选项}。
    \item biblatex3.4以后的版本可以使用foreach选项,而3.0版只能一个域一个域的处理,意味着每一个域处理都要写一个map 步。
    \item date域仅作为解析用,不出现在bbl文件中,所以在bbx内部进行日期判断的时候要注意,不使用date 域而要用由其解析出来的year 等域进行判断,而且当date域的内容不符合解析格式要求时,自动忽略掉,那么信息有可能丢失,因此当有不符合解析格式的日期信息时应放到year 域中。
    \item 动态数据处理中利用正则表达式可以用来处理特殊字符,对于参考文献信息中一些特殊字符比如\&等,除了利用jabref软件的biblatex 可以自动转换外,利用动态数据修改也可以做一定的处理,比如对一些容易出现这种字符的域进行处理,使其内容符合tex源文件书写规则,即在特殊字符前加上斜杠。注意利用正则表达式处理\%,\#时直接在regexp中写字符没有问题,但是对于\&字符就存在问题,所以对于该字符使用十六进制表示方法\verb|\x26|。 比如:



    \begin{texlist}
    %for texlive >2016
    \DeclareStyleSourcemap{
        \maps[datatype=bibtex]{
            \map[overwrite, foreach={title,booktitle,journaltitle,journal,publisher,address,location,institution,organization}]{
                \step[fieldsource=\regexp{$MAPLOOP}, match=\regexp{([^\\])\#}, replace=\regexp{$1\\\#}]
            }
            \map[overwrite, foreach={title,booktitle,journaltitle,journal,publisher,address,location,institution,organization}]{
                \step[fieldsource=\regexp{$MAPLOOP}, match=\regexp{([^\\])\%}, replace=\regexp{$1\\\%}]
            }
            \map[overwrite, foreach={title,booktitle,journaltitle,journal,publisher,%
            address,location,institution,organization}]{
                \step[fieldsource=\regexp{$MAPLOOP}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
        }
    }

    %for texlive 2015
    \DeclareStyleSourcemap{
        \maps[datatype=bibtex]{
            \map[overwrite]{%title,booktitle,journaltitle,journal,publisher,address,location,institution,organization
            \step[fieldsource={title}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={booktitle}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={journaltitle}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={journal}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={publisher}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={address}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={location}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={institution}, match=\regexp{([^\\])\x26}, replace=\regexp{$1\\\x26}]
            }
            \map[overwrite]{
            \step[fieldsource={booktitle}, match=\regexp{([^\\])\#}, replace=\regexp{$1\\\#}]
            }
            \map[overwrite]{
            \step[fieldsource={booktitle}, match=\regexp{([^\\])\%}, replace=\regexp{$1\\\%}]
            }
        }
    }
    \end{texlist}

  \end{enumerate}

\subsubsection{数据模型}
  下面介绍biblatex数据模型与动态数据处理的关系。

  biblatex提供了数据模型定义功能,这在真正需要定义一些新的条目类型和域时是用得到的。但实际上,从本样式实践的经验看,为了biblatex 的兼容性考虑,没有必要使用数据模型定义功能去费力地定义新的条目类型,反而直接利用动态数据处理来将bib 中的一些类型转换成biblatex 支持的类型会更方便,其中要做一定的区分可以利用一些域的信息进行判断,比如note域等于news 或standard。
  \begin{enumerate}
      \item biblatex默认做的别名处理其实是用DeclareDriverSourcemap做的,这是驱动层的映射。在本样式中,因为usera域是在用户层的映射中做的,所以biblatex做的默认别名处理还不够,还需要在用户层首先处理usera域。而因为DeclareDriverSourcemap 中会增加一些不需要的信息,比如thesis类型中的typer域在GB/T7714标准中是并不需要的,这可以利用DeclareSourcemap,DeclarestyleSourcemap(\bc{注意texlive2016 的biblatex3.4 仅支持1 个styleSourcemap,而biblatex3.7则已经支持多个styleSourcemap})先进行映射,这样就避开了DeclareDriverSourcemap。 或者在增加DeclareDriverSourcemap,将标准样式中的默认DeclareDriverSourcemap增加的信息去掉(详见gb7714-2015ay.bbx中的处理和说明)。
      \item 数据模型在blx-dm.DEF中,可以看到standard有条目类型定义,但域和约束没有定义,而biblatex标准样式默认做的别名处理中的其它一些条目比如electronic等是有域和约束定义的。
      \item 标准样式standard.BBX中的DeclareBibliographyAlias\{*\}\{misc\} 将一些数据模型中没有定义的条目直接用misc条目的驱动处理,这不是驱动层的数据源映射,只是利用其驱动进行输出。有一个问题是DeclareBibliographyAlias\{newspaper\}\{article\}是否可以实现?还是要定义数据模型?从实践结果看是不需要定义数据模型的,并且驱动的别名处理等价于驱动层映射。比如:
          做了用户层映射后:
          \begin{texlist}
          \DeclareSourcemap{
            \maps[datatype=bibtex]{%增加文献标识符如[M],[J]等,下面首先生成这一信息
                \map{
                    \pertype{newspaper}%增加一个新闻报纸的类型newspaper
                    \step[fieldset=usera, fieldvalue={N}]%因为没有专门的驱动,这句的目的是定义一个usera域,方便映射为article 后判断
                    \step[fieldset=note, fieldvalue=news]
                    }
                }
            }
            \end{texlist}

            做别名处理:
            \begin{texlist}
            \DeclareBibliographyAlias{newspaper}{article}%定义驱动别名,以替代驱动层映射
            \end{texlist}

            能达到驱动层或样式层中条目类型转换所实现的效果。
            \begin{texlist}
            \DeclareStyleSourcemap{
                \maps[datatype=bibtex]{
                    \map{%尝试未定义数据模型的newspaper类型映射为article,newspaper完全是针对gb7714的新类型,在biblatex 中完全没有定义
                         %但从实践看,并没有什么影响,映射过来就可以了。
                    \step[typesource=newspaper, typetarget=article, final]
                    }
                }
            }
            \end{texlist}

      \item 从实践看,数据模型中完全没有定义的条目类型newspaper也可以进行数据源映射。
  \end{enumerate}

\subsubsection{用于关联条目的动态修改的命令封装及关联条目格式}\label{sec:data:mdf:forrelated}

实现动态的条目关联,可以利用动态数据修改的方法。要对多个条目实现关联,那么需要多次数据映射,biblatex3.7及以上版本可以存在多个DeclareStyleSourcemap,因此做关联的封装命令就是基于此:

\begin{texlist}
    \newcommand{\defdoublelangentry}[2]{%
    \edef\entrykeya{#1}
    \edef\entrykeyb{#2}
        \DeclareStyleSourcemap{
          \maps[datatype=bibtex]{
            \map{
              \step[fieldsource=entrykey, match=\entrykeya, final]
              \step[fieldset=related, fieldvalue=\entrykeyb]
            }
          }
       }
    }
\end{texlist}

命令defdoublelangentry有两个输入参数,第一个是主条目,第二个是与主条目关联的条目的列表。多次使用该命令,即可实现多次数据映射,当然因为DeclareStyleSourcemap只能存在于导言区,因此defdoublelangentry也只能存在于导言区。

关联条目之间用命令relateddelim分隔,但实际上因为related宏输出时,不知道是何原因考虑的是主条目的关联条目之间的分隔,这在双语文献中是有问题的,需要在主条目后也进行分隔,因此对该宏修改如下:

\begin{texlist}
\renewbibmacro*{related}{%
  \ifboolexpr{ test {\iffieldundef{related}} or test {\ifrelatedloop} }
    {}
    {\usebibmacro{begrelated}%
     \def\bbx@tempa{}%
     \setcounter{bbx:relatedtotal}{0}%
     \def\do##1{%
       \entrydata{##1}{%
         \ifrelatedloop
           {}
           {\stepcounter{bbx:relatedtotal}%
            \gappto{\bbx@tempa}{##1,}}}}%
     \docsvfield{related}%
     \restorefield{related}{\bbx@tempa}%
     \ifnumgreater{\value{bbx:relatedtotal}}{0}
       {\listcsxadd{bbx:relatedloop}{\strfield{entrykey}}%
        \iffieldundef{clonesourcekey}
          {}
          {\listcsxadd{bbx:relatedloop}{\strfield{clonesourcekey}}}%
        \setcounter{bbx:relatedcount}{0}%
        \def\do{%
          \stepcounter{bbx:relatedcount}%
          \ifnumgreater{\value{bbx:relatedcount}}{0}%为使主条目与关联条目做分隔,这里做修改,从1改为0
            {\ifcsundef{relateddelim\strfield{relatedtype}}
              {\printtext{\relateddelim}}
              {\printtext{\csuse{relateddelim\strfield{relatedtype}}}}}
            {}}%
        \ifbibmacroundef{related:\strfield{relatedtype}}
          {\appto{\do}{\usebibmacro{related:default}}}
          {\appto{\do}{\usebibmacro*{related:\strfield{relatedtype}}}}%
        \iffieldformatundef{related:\strfield{relatedtype}}
          {\def\bbx@tempa{related}}
          {\def\bbx@tempa{related:\strfield{relatedtype}}}%
        \iffieldformatundef{relatedstring:\strfield{relatedtype}}
          {\def\bbx@tempb{relatedstring:default}}
          {\def\bbx@tempb{relatedstring:\strfield{relatedtype}}}%
        \printtext[\bbx@tempa]{%
          \usebibmacro{begrelatedloop}%
          \iffieldundef{relatedstring}
            {\ifboolexpr{
               test {\ifnumgreater{\value{bbx:relatedtotal}}{1}}
               and
               test {\ifbibxstring{\thefield{relatedtype}s}}
             }
               {\printtext[\bbx@tempb]{%
                  \bibstring[\mkrelatedstring]{\thefield{relatedtype}s}}}
               {\iffieldbibstring{relatedtype}
                  {\printtext[\bbx@tempb]{%
                     \bibstring[\mkrelatedstring]{\thefield{relatedtype}}}}
                  {}}}
            {\iffieldbibstring{relatedstring}
               {\printtext[\bbx@tempb]{%
                  \bibstring[\mkrelatedstring]{\thefield{relatedstring}}}}
               {\printfield[\bbx@tempb]{relatedstring}}}%
          \docsvfield{related}%
          \usebibmacro{endrelatedloop}}}%
       {}%
     \usebibmacro{endrelated}}}
\end{texlist}

\subsection{标注(引用)标签}
引用标签的生成机制,即责任者截短时的歧义消除问题,见说明文档4.11.4 Name Disambiguation 节。
  \begin{enumerate}
    \item uniquename的作用,用于姓名间的歧义消除。
    \item uniquelist的作用,用于姓名列表间的歧义消除。
  \end{enumerate}


关于这两个选项的参数设置,可以在样式中设置,也可以在宏包加载时设置,\bc{注意宏包加载时的设置会覆盖样式中的设置}。

还要注意,说明文档中uniquelist的默认选项是false,这是错误的,从实践看是true,从biblatex.sty文件的代码看也是如此,比如:
\begin{texlist}
\DeclareBibliographyOption[boolean]{uniquelist}[true]{%
  \ifcsdef{blx@opt@uniquelist@#1}
    {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
    {\blx@err@invopt{uniquelist=#1}{}}}
\DeclareTypeOption[boolean]{uniquelist}[true]{%
  \ifcsdef{blx@opt@uniquelist@#1}
    {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
    {\blx@err@invopt{uniquelist=#1}{}}}
\DeclareEntryOption[boolean]{uniquelist}[true]{%
  \ifcsdef{blx@opt@uniquelist@#1}
    {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
    {\blx@err@invopt{uniquelist=#1}{}}}
\def\blx@opt@uniquelist@false{0}
\def\blx@opt@uniquelist@true{1}
\def\blx@opt@uniquelist@minyear{2}
\end{texlist}
无论选项是否给出,上面定义选项中的代码都会自动执行,当选项不给出,则自动调用默认的参数(因为代码中直接使用了输入参数,当没有输入参数,自然就会使用默认参数)来进行处理,显然这里是true。

\subsubsection{标签中的标点和间隔符号}\label{sec:label:fmt}
文献表中的标签和正文中的标注标签都有标点和间隔符号问题,但两者可能存在一定的差异,不同版本的biblatex中也可能不同,但新的版本中通常是可以用一个相同的钩子来实现的,比如作者年制中作者和年份之间的标点:
\begin{texlist}
\renewcommand*{\nameyeardelim}{\addcomma\space}
\end{texlist}

\subsection{日期格式控制}\label{sec:date:fmt}
随着biblatex的更新,日期格式控制更趋完善。加上biblatex3.8a中biber解析出日期中月份和天数都不带引导的0,比如6月直接解析为6,而不像以前那样解析为06,所以需要特别的注意。因此对于新版本,有些日期比如online的发布日期,访问日期等,采用专门的格式edtf控制,而老版本则仍然使用原来定义的输出宏。比如:

\begin{texlist}
\defversion{3.7}{date}{
    \DeclareFieldFormat{urldate}{##1}
    \renewbibmacro*{urldate}{%
    \addspace\printtext{[}\printurldate\printtext{]}}%能用高层命令+选项尽量用命令(比如这里的\printurldate),而不用\blx@edtfdate这种更底层的命令

    \newbibmacro*{newsdate}{%%新增加一个新闻日期
    \blx@edtfdate{}{}%
    }

    \newbibmacro*{modifydate}{%新增加一个带括号的日期,用于表示电子资源的更新和修改日期,而公告日期则按日期格式
        \iffieldundef{year}{%
                \iffieldundef{endyear}{\iffieldundef{eventyear}{}{\printtext{(}\printeventdate\printtext{)}}}%
                {\printtext{(}\printenddate\printtext{)}}%
        }{\iffieldequalstr{year}{}{%因为year存在,但为空
            }{\printtext{(}\blx@edtfdate{}{}\printtext{)}}%
         }%
    }%
}

\defversion{3.4}{date}{
    \renewbibmacro*{urldate}{%
    \addspace\printtext{[}\printfield{urlyear}%
    \iffieldundef{urlmonth}{}{\bibrangedash\printfield{urlmonth}}%
    \iffieldundef{urlday}{}{\bibrangedash\printfield{urlday}}\printtext{]}}

    \newbibmacro*{newsdate}{%%新增加一个新闻日期
    \iffieldundef{year}{}{\printfield{year}%
    \iffieldundef{month}{}{\bibrangedash\printtext{\thefield{month}}%
    \iffieldundef{day}{}{\bibrangedash\printfield{day}}}}%
    }

    \newbibmacro*{modifydate}{%新增加一个带括号的日期,用于表示电子资源的更新和修改日期,而公告日期则按日期格式
        \iffieldequalstr{year}{}{%替换\iffieldundef{year},因为year总是存在,但为空
            \iffieldundef{endyear}{%
                \iffieldundef{eventyear}{}{\printtext{\mkbibparens{\printtext{\printfield{eventyear}}%
                \iffieldundef{eventmonth}{}{\bibrangedash\thefield{eventmonth}}%
                \iffieldundef{eventday}{}{\bibrangedash\printfield{eventday}}}}%
                }%
            }{%
                \iffieldundef{endyear}{}{\printtext{\mkbibparens{\printtext{\printfield{endyear}}%
                \iffieldundef{endmonth}{}{\bibrangedash\thefield{endmonth}}%
                \iffieldundef{endday}{}{\bibrangedash\printfield{endday}}}}%
                }%
            }%
        }%
        {%
            \iffieldundef{year}{}{\printtext{\mkbibparens{\printtext{\printfield{year}}%
            \iffieldundef{month}{}{\bibrangedash\thefield{month}}%
            \iffieldundef{day}{}{\bibrangedash\printfield{day}}}}%
            }%
        }%
    }%
}

\iftoggle{iftlfive}%%根据texlive/biblatex版本选择
    {\switchversion{3.4}{date}}%
    {\iftoggle{iftlsix}%
        {\switchversion{3.4}{date}}%
        {\switchversion{3.7}{date}}%
    }
\end{texlist}

\subsubsection{文献表条目标签中的日期格式}\label{sec:dateinlabel}
主要用于authoryear样式,在authoryear样式中有一个mergedate选项,使用该选项可以进行更多的标签日期格式控制。其中主要是重定义了date+extradate(3.8版,以前的版本叫date+extrayear).

其中有两点需要注意:

1. printdateextra,printlabeldateextra,这样的命令在biblatex.sty中是找不到的,因为biblatex实际定义的如下的命令:
\begin{texlist}
{\protected\def\blx@imc@printlabeldate{\csuse{mkdaterange#1}{label}}
        \protected\def\blx@imc@printlabeldateextra{\csuse{mkdaterange#1extra}{label}}}
\end{texlist}

然后由如下命令,解析为printdateextra,printlabeldateextra:
\begin{texlist}
\blx@regimcs{\printlabeldate \printlabeltime \printlabeldateextra \stripzeros \forcezerosy \forcezerosmdt \mkyearzeros \mkmonthzeros \mkdayzeros \mktimezeros}
\end{texlist}

biblatex很多命令都有类似的方式。

2. 日期的数据来源由DeclareLabeldate定义选择。
日期的的具体格式,则由宏包选项控制。比如labeldate=ymd来控制。(3.5版以上,以前的是datelabel选项)

\subsection{作者格式控制}\label{sec:name:fmt}
\zhongdian{【注意】:texlive2015中的biblatex版本是3.0,texlive2016中biblatex的版本是3.4,新版本对于名字域打印有了较大变化(即不同版本的biblatex对于DeclareNameFormat的输入参数处理有所不同,如例\ref{eg:name:variables}所示),所以需做相应的修改,为此在biblatex中首先进行版本判断,然后根据版本不同分别进行设置。}

    \begin{codetex}{texlive2016中biblatex3.4版Name域格式输入参数的修改}{eg:name:variables}
    for biblatex version 3.0
    #1 The last names.
    #2 The last names, given as initials.
    #3 The first names.
    #4 The first names, given as initials.
    #5 The name prefixes,
    #6 The name prefixes, given as initials.
    #7 The name affixes,
    #8 The name affixes, given as initials.
    for biblatex version 3.4
    \namepartfamily
    \namepartfamilyi
    \namepartgiven
    \namepartgiveni
    \namepartprefix
    \namepartprefixi
    \namepartsuffix
    \namepartsuffixi
    \end{codetex}
    样式文件中的处理见\ref{sec:name:fmt:out}节。

\subsubsection{作者信息输出与格式控制}\label{sec:name:fmt:out}
作者信息的输出最高一层是在驱动中:
\begin{texlist}
\usebibmacro{author/editor+others/translator+others}
\end{texlist}

其中当存在作者时,由如下宏输出:
\begin{texlist}
\renewbibmacro*{author}
\end{texlist}

其中作者列表又由如下命令输出:
\begin{texlist}
\printnames{author}
\end{texlist}

printnames这种命令的输出格式通常由相应输出域的域格式控制,这里则是author域控制:
\begin{texlist}
\DeclareNameAlias{author}{sortname}%for author year style

\DeclareNameAlias{author}{default}%for numeric style
\end{texlist}

其中sortname,default域格式又是:
\begin{texlist}
\DeclareNameAlias{sortname}{family-given/given-family}

\DeclareNameAlias{author}{default}
\DeclareNameAlias{default}{given-family}
\end{texlist}

其中的关键是given-family和family-given两个域格式使用name:family-given和name:family-given宏进行输出。
真实的作者姓名格式在这两个宏中,因此做一定的处理。注意其中的输入参数为:
{namepartfamily},{namepartgiveni},{namepartprefix},{namepartsuffix}(使用名的首字母缩写)或
{namepartfamily},{namepartgiven},{namepartprefix},{namepartsuffix}(不使用缩写)。

\begin{texlist}
    %biblatex3.3版后(比如texlive2016中的3.4版)的使用方式
    \renewbibmacro*{name:given-family}[4]{%利用family-given定义given-family
      \ifuseprefix
        {\usebibmacro{name:delim}{##3##1}%
         \usebibmacro{name:hook}{##3##1}%
         \ifdefvoid{##3}{}{%
           \ifcapital
             {\mkbibnameprefix{\MakeCapital{##3}}\isdot}
             {\mkbibnameprefix{##3}\isdot}%
           \ifprefchar{}{\bibnamedelimc}}%
         \ifdefvoid{##2}{\mkbibnamefamily{\MakeCapital{##1}}}{\mkbibnamefamily{\MakeUppercase{##1}}}\isdot
         \ifdefvoid{##2}{}{\revsdnamepunct\bibnamedelimd\mkbibnamegiven{\MakeUppercase{##2}}\isdot}%\MakeCapital
         \ifdefvoid{##4}{}{\bibnamedelimd\mkbibnamesuffix{##4}\isdot}}
        {\usebibmacro{name:delim}{##1}%
         \usebibmacro{name:hook}{##1}%
         \ifdefvoid{##2}{\mkbibnamefamily{\MakeCapital{##1}}}{\mkbibnamefamily{\MakeUppercase{##1}}}\isdot
         %
         \ifboolexpe{%
           test {\ifdefvoid{##2}}
           and
           test {\ifdefvoid{##3}}}
           {}
           {\revsdnamepunct}%
         \ifdefvoid{##2}{}{\bibnamedelimd\mkbibnamegiven{\MakeUppercase{##2}}\isdot}%\MakeCapital
         \ifdefvoid{##3}{}{\bibnamedelimd\mkbibnameprefix{##3}\isdot}
         \ifdefvoid{##4}{}{\bibnamedelimd\mkbibnamesuffix{##4}\isdot}}
     }
     \renewbibmacro*{name:family-given}[4]{%
     \usebibmacro{name:given-family}{##1}{##2}{##3}{##4}}

        %biblatex3.3版前(比如texlive2015中的3.0版)的使用方式
    \renewbibmacro*{name:last-first}[4]{%
      \ifuseprefix
        {\usebibmacro{name:delim}{##3##1}%
         \usebibmacro{name:hook}{##3##1}%
         \ifblank{##3}{}{%
           \ifcapital
             {\mkbibnameprefix{\MakeCapital{##3}}\isdot}
             {\mkbibnameprefix{##3}\isdot}%
           \ifpunctmark{'}{}{\bibnamedelimc}}%
         %\mkbibnamelast{#1}\isdot
         \ifblank{##2}{\MakeCapital##1}{\mkbibnamelast{\MakeUppercase{##1}}}\isdot%\MakeUppercase %\mkbibnamelast{\MakeUppercase{#1}} %\MakeSentenceCase
         %注意上一句\MakeCapital后面如果再跟一个{}包含#1,则没有效果,可能是包在里面少了一层展开
         %因为机构名通常包括在{}内,所以要多展开一次才行,所以这里去掉#1 外面的{}
         %\mkbibnamelast{\MakeUppercase{#1}}\isdot
         %\ifblank{#4}{}{\bibnamedelimd\mkbibnameaffix{#4}\isdot}%这句放到后面
         \ifblank{##2}{}{\revsdnamepunct\bibnamedelimd\mkbibnamefirst{\MakeUppercase{##2}}\isdot}%
         \ifblank{##4}{}{\addcomma\addspace\bibnamedelimd\mkbibnameaffix{##4}\isdot}}
        {\usebibmacro{name:delim}{##1}%
         \usebibmacro{name:hook}{##1}%
         %\mkbibnamelast{#1}\isdot  %3.9.1 Generic Commands and Hooks,对姓重新处理,如下句: %\mkbibnamelast{\MakeUppercase{#1}}
         \ifblank{##2}{\MakeCapital##1}{\mkbibnamelast{\MakeUppercase{##1}}}\isdot  %大写,参考4.6.4 Miscellaneous Commands,\MakeUppercase %\MakeSentenceCase
         %\mkbibnamelast{\MakeUppercase{#1}}\isdot
         %\ifblank{#4}{}{\bibnamedelimd\mkbibnameaffix{#4}\isdot}%这句放到后面
         \ifblank{##2##3}{}{\revsdnamepunct}%
         \ifblank{##2}{}{\bibnamedelimd\mkbibnamefirst{\MakeUppercase{##2}}\isdot}%
         \ifblank{##3}{}{\bibnamedelimd\mkbibnameprefix{##3}\isdot}%
         \addcomma\addspace%
         \ifblank{##4}{}{\addcomma\addspace\bibnamedelimd\mkbibnameaffix{##4}\isdot}%
         }
     }

     \renewbibmacro*{name:first-last}[4]{%
     \usebibmacro{name:last-first}{##1}{##2}{##3}{##4}}
\end{texlist}




\subsection{样式文件设计途径}
  biblatex的核心-参考文献样式文件的设计,更详细内容见
  \href{https://github.com/hushidong/biblatex-solution-to-latex-bibliography}{LaTeX 文档中文参考文献的 biblatex 解决方案}。
  \begin{enumerate}
    \item driver的作用:条目驱动,修改一些顺序,略去一些输出和标点
    \item micro的作用:输出宏,修改需要的输出内容
    \item format的作用:域打印格式,修改一些斜体,强调样式等。
    \item command的作用:一些设置和命令
    \item biblatex.sty/def和各bbx/cbx文件中的代码
  \end{enumerate}

\subsubsection{文献表条目内容组织的原理以及问题查找的方法}
biblatex是利用tex语句控制文献内容组织,因此我们可以坚定一点就是,对于文献内容组织一定不是神秘的,是可以分析清楚的,当出现问题的时候,通过一步步的分析是能解决好的。

如前所述,根据宏包设置,使用biber解析完参考文献信息后,就需要利用样式中的各种定义来输出文献表。我们从某一条参考文献来看问题。某一类型的参考文献输出由该类型的driver控制,driver中控制各种bibmacro来组织内容输出,bibmacro利用各种fieldformat,command来控制域的格式和标点,当出现一些特殊的问题时,我们可以顺着这样的思路来查找。

下面我们举例来说明本样式的作者年制中,当作者缺省时,利用title判断中英文出错的问题。这个问题本质上由于前面说过的,当作者缺省时,把title作为标签后,会把title域清除,因此再利用title域信息判断中英文,自然无法正常工作。我们来看看这是怎么一个过程:

这是一个作者缺省的book条目,在gb7714-2015ay样式不使用佚名方式的情况下报错,主要是testCJKfirst函数报错。这个函数主要用在作者,出版项等这些信息输出时的中英文判断。因为作者缺省,因此作者输出时就没有判断,而出错只能是在出版项中。我们把book的driver中macro输出一项一项注释掉并测试发现,当作者输出相关的macro存在时存在错误,注释掉则没有问题。于是深入来分析:

在book类的driver简化为如下三项输出:
\begin{texlist}
\DeclareBibliographyDriver{book}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/editor+others/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{maintitle+title}%
  \newunit
  \usebibmacro{publisher+location+date}%
  \newunit\newblock
  \usebibmacro{finentry}}
\end{texlist}

其中usebibmacro\{author/editor+others/translator+others\}导致出错,该macro的思路是当存在author时输出author,没有时判断是否存在editor,存在则输出,不存在则判断是否存在translator,并进一步判断输出:
\begin{texlist}
\newbibmacro*{author/editor+others/translator+others}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{author}}
    {\ifboolexpr{
       test \ifuseeditor
       and
       not test {\ifnameundef{editor}}
     }
       {\usebibmacro{editor+others}}
       {\usebibmacro{translator+others}}}}
\end{texlist}

显然这个例子中不存在author和editor,因此宏转到macro\{translator+others\},我们来看这个宏:
\begin{texlist}
\newbibmacro*{translator+others}{%
  \ifboolexpr{
    test \ifusetranslator
    and
    not test {\ifnameundef{translator}}
  }
    {\printnames{translator}%
     \setunit{\printdelim{translatortypedelim}}%
     \usebibmacro{translator+othersstrg}%
     \clearname{translator}}
    {}}
\end{texlist}

这个宏来自biblatex.def,显然这个宏表明当translator不存在则不做任何事情,这种情况下是不会出错的,于是我们再找,发现这个宏在authoryear.bbx中重定义了。
\begin{texlist}
\renewbibmacro*{translator+others}{%
  \usebibmacro{bbx:translator}{translator+othersstrg}}

\newbibmacro*{bbx:translator}[1]{%
  \ifboolexpr{
    test \ifusetranslator
    and
    not test {\ifnameundef{translator}}
  }
    {...code for existed translator...}%
    {\global\undef\bbx@lasthash
     \usebibmacro{labeltitle}%
     \setunit*{\printdelim{nonameyeardelim}}}%
  \usebibmacro{date+extradate}}
\end{texlist}

显然当translator不存在时,使用了labeltitle宏,再来看这个宏:
\begin{texlist}
\newbibmacro*{labeltitle}{%
  \iffieldundef{label}
    {\iffieldundef{shorttitle}
       {\printfield{title}%
        \clearfield{title}}
       {\printfield[title]{shorttitle}}}
    {\printfield{label}}}
\end{texlist}
从中可以看到,该宏把title域作为标签进行输出,并在输出后清除了title域,自然,在完成了整个author/editor+others/translator+others宏后,title域就不存在了,因此在后面的publisher+location+date宏中使用title域来进行中英文判断是必然会出错的,找到了问题所在,那么就有相应的方法,比如在动态数据修改时,把title信息存储到userd域中,然后publisher+location+date宏利用该域的信息进行判断这样就不会出现问题了。

\subsection{宏包选项增加}

biblatex的宏包选项增加
  \begin{enumerate}
    \item 在gb7714-2015.bbx文件中有四种常见的判断方式包括:
    版本的判断,
    宏包选项的判断,
    宏包选项控制的切换标记的判断,
    一般的域的是否定义或与字符串比较是否相同的判断。

        第一种判断,是直接根据已有的信息比如\verb|\abx@version|进行处理,该出的处理结果是直接展开的,可以用于后面的任意定义。

        第二种判断,是根据给出的宏包选项值或者不给出选项进行处理,例如定义的宏包选项gbalign ,这一选项是string 类型。在选项的执行代码中直接给出每一个选项值对应要执行的命令。比如:
        \begin{texlist}
        \DeclareBibliographyOption[string]{gbalign}[right]{%
            \ifstrequal{##1}{left}{\setalignleft}{}
            \ifstrequal{##1}{gb7714-2015}{\setaligngbstyle}{}
        }
        \end{texlist}
        这种情况下,特别要注意DeclareBibliographyOption 选项定义命令中给出的默认值right是在加载该选项但不给出值时的默认值,而不是将选项设置为该默认值。因此当加载时不给出gbalign选项时,不执行任何的语句,即不执行setalignleft,也不执行setaligngbstyle(因为不使用这两个命令的情况下项标签是右对齐的,这样也就是gbalign选项默认是右对齐的,只有设置宏包选项为left或gb7714-2015时才会因为setalignleft和setaligngbstyle命令二改变)。
        如果给出选项gbalign,相当于gbalign=默认值,如果给出选项gbalign=指定值,那么值就是指定值,然后并执行DeclareBibliographyOption 的定义代码,根据值进行处理。

        第三种判断,根据宏包选项控制对切换标记进行设置,然后再代码中应用切换标记判断。比如gbpub 选项,这一选项类似于standard.bbx中定义的url 等选项。
        \begin{texlist}
        \newtoggle{bbx:gbpub}
        \DeclareBibliographyOption[boolean]{gbpub}[true]{%
            %\settoggle{bbx:gbpub}{#1} %或采用下面这一句
            \ifstrequal{##1}{false}{\togglefalse{bbx:gbpub}}{\toggletrue{bbx:gbpub}}}
        \end{texlist}
        默认可以利用切换标记bbx:gbpub进行任何的定义。但如果展开的层次是与这里定义的宏包选项同一层次的,那么切换标记会根据默认值是false 而展开。如果是下一层的展开(就是不需要在加载时展开的),那么会根据展开时切换标记bbx:gbpub的值进行展开。

        注意到在上述这一定义后面,使用了选项默认执行命令:
        \begin{texlist}
        \ExecuteBibliographyOptions{gbpub}
        \end{texlist}
        这是宏包选项定义中的代码会立刻被执行,即bbx:gbpub的值设置为true。ExecuteBibliographyOptions 命令是用来执行选项的,如果不给出这一命令,且宏包加载选择中没有给出选项设置,那么toggle只有新建toggle 时的默认定义。还要注意这里的切换标记设置是立刻进行的,如果这里的定义不是设置切换标记,而是直接调用命令,比如上面的gbalign的情况,那么就需要该被调用命令是有定义的,即定义至少与宏包选项定义在同一展开层次,甚至先于宏包选项定义。

        还需要注意,如果给出了命令
        \begin{texlist}
        \ExecuteBibliographyOptions{gbpub}%等价于下一条命令
        \ExecuteBibliographyOptions{gbpub=true}
        \ExecuteBibliographyOptions{gbpub=false}
        \end{texlist}
        等价于在宏包加载时给出选项。但是宏包加载选项设置可以覆盖这个命令的设置。

        如果在宏包加载时给出选项gbpub=false,那么bbx:gbpub的值设置为false。
        如果在宏包加载时给出选项gbpub,gbpub=true,那么bbx:gbpub的值设置为true。

        第四种判断,利用iffieldundef和iffieldequalstr进行判断即可。

    \item 总结起来,宏包选项的问题需要注意宏包选项的展开顺序。宏包选项的定义如果不使用ExecuteBibliographyOptions命令或者不在加载时设置,那么定义的代码是不执行的。因此如果其他代码中需要使用该宏包选项定义代码中的信息是无法正确获取的。而当使用ExecuteBibliographyOptions命令或者加载选项时,那么宏包选项代码会立即展开,其中需要使用的宏则需要有定义,即先于或与宏包选项定义处于同一展开层。

        \begin{texlist}
    %\newtoggle{bbx:gbpub}
    %\DeclareBibliographyOption[boolean]{gbpub}[true]{%
    %  \settoggle{bbx:gbpub}{#1}}
    %这种机制的标识判断,能用于usemacro使用,域格式定义中,但无法用来判断后定义macro
    %定义宏和使用宏是两个不同的展开层级,而可以在定义macro中进行判断
    %\ExecuteBibliographyOptions{gbpub}
    %但是使用这句默认设置可以用来定义macro

    %\DeclareBibliographyOption{gbpub}[true]{%应使用这种直接的机制
    %\ifstrequal{#1}{false}{\pubaddmacronewdefine}{\pubaddmacroredefine}}

    %特别注意DeclareBibliographyOption,而给出的默认值是在加载时没有选项没有给出值时的默认值。
    %当加载时不给出gbpub选项时,不执行ifstrequal判断语句,无任何加载。
    %如果给出选项gb,或者gb=true,那么ifstrequal判断仍然是假,执行的默认的加载\pubaddmacroredefine
    %如果给出选项false,那么ifstrequal判断是真,执行的就是非默认的加载\pubaddmacronewdefine
    %\ExecuteBibliographyOptions{gbpub}%这句报错是因为\pubaddmacroredefine没有定义,如果把定义放到前面那么应该是可以的。

    %还是采用另一种方式可以较好的进行默认选项的处理
    \newtoggle{bbx:gbpub}
    \DeclareBibliographyOption[boolean]{gbpub}[true]{%
    %\settoggle{bbx:gbpub}{#1} %或采用下面这一句
      \ifstrequal{#1}{false}{\togglefalse{bbx:gbpub}}{\toggletrue{bbx:gbpub}}}
    \ExecuteBibliographyOptions{gbpub}

    \end{texlist}

  \end{enumerate}


\subsection{文献表环境和打印输出}
  biblatex宏包的参考文献表的打印
  \begin{enumerate}
  \item 根据biblatex.sty文件中的\verb|\blx@bibliography|命令可以知道,定义的参考文献表的环境的开始代码在命令中\verb|\blx@bibliography| 中,结束代码在\verb|\blx@endbibliography|中,循环项代码在\verb|\blx@bibitem| 中的\verb|blx@item@\blx@theenv}|命令中。参考文献循环打印依靠\verb|\blx@listloop| 命令实现。
  \item 从\verb|\blx@listloop|可以知道,各条参考文献表的指引信息是混合在一起的并且以|字符为分隔。将混合的参考文献指引信息解析成单独的指引信息,并交给\verb|\blx@bibitem|命令处理。
  \item \verb|\blx@bibitem|首先开始一个编组,然后根据单独一条参考文献的指引信息,获取数据,执行判断,利用参考文献表环境定义的循环项代码对参考文献内容设置段落格式,最后结束编组。在定义gbalign=gb7714-2015 样式的段落格式时,采用了parshape 或者hangindent命令来实现,所以其中增加了一个par 命令以使其生效。
  \end{enumerate}


\subsection{biblatex版本以及样式的兼容性}\label{sec:blx:compatibility}
样式首先根据biblatex版本信息进行版本判断,然后做针对性的兼容处理。
biblatex在texlive中的版本对应关系是:
texlive2015对应biblatex3.0;
texlive2016对应biblatex3.4,从3.2版开始修改了姓名机制(如\ref{sec:name:fmt}节所述);
texlive2017对应biblatex3.7;
2017年底又出了biblatex3.8a到3.10版。

  \begin{enumerate}
  \item biblatex版本判断

  原来是使用一个简单的字符流处理来解析版本信息,但容易出现问题。于是换成利用xstring宏包的命令来提取版本中的数字进行判断:
  \begin{texlist}
    %版本判断
    \providetoggle{iftexlivesix}%用于处理biblatex3.3开始改变的新的姓名机制
    \providetoggle{iftexliveseven}%用于处理biblatex3.7的兼容性
    \providetoggle{iftexliveeight}%用于处理biblatex3.8a的兼容性
    %\def\numparserta#1.#2a\relax{#1}%注意relax的重要性
    %\def\numparsertb#1.#2a\relax{#2}
    %\def\numinteger{\expandafter\numparserta\abx@version\relax}
    %\def\numdigital{\expandafter\numparsertb\abx@version\relax}
    \StrChar{\abx@version}{3}[\numdigital]
    %根据biblatex更新历史,当版本大于3.2开始,就用设置\toggletrue{iftexlivesix}
    \ifnumcomp{\numdigital}{>}{2}{\toggletrue{iftexlivesix}}{\togglefalse{iftexlivesix}}
    \ifnumcomp{\numdigital}{>}{6}{\toggletrue{iftexliveseven}}{\togglefalse{iftexliveseven}}
    \ifnumcomp{\numdigital}{>}{7}{\toggletrue{iftexliveeight}}{\togglefalse{iftexliveseight}}
  \end{texlist}


  \item biblatex版本的一些兼容性处理

  宏包选项:
  \begin{texlist}
  firstinits=true,%for texlive2014,2015;biblatex <=3.2
  giveninits=true,%for texlive2016,2017;biblatex >=3.3
  labeldate=true,%for texlive2014,2015,2016,2017;biblatex <3.8
  labeldateparts=true,%for biblatex >=3.8a
  \end{texlist}

  命令:
  \begin{texlist}
  \printdateextralabel,%for texlive2014,2015,2016;biblatex <=3.4
  \printlabeldateextra,%for texlive2017;biblatex >=3.7
  \DeclareSortingScheme %for texlive2014,2015,2016,2017;biblatex <3.8
  \DeclareSortingTemplate %for biblatex >=3.8a
  \end{texlist}

  \item 版本与兼容性的最终处理方法

  经过最终设计,下面给出的另一版本兼容性处理方式取代前面给出的处理方式,便于以后的扩展。这种方式自然兼容最新的版本,但老的版本的代码处理必须要到位,即因为biblatex版本升级增加了新的老版本时,对应该老版本的选择必须要实现,否则可能漏掉这些版本的处理。
  \begin{texlist}
    %版本判断,当版本继续更新时,增加一个新的toggle用以处理新的旧版,最新版本永远用iftlatest
    \providetoggle{iftlfive}%用于处理biblatex3.2之前的版本
    \providetoggle{iftlsix}%用于处理biblatex3.3开始改变的新的姓名机制后版本
    \providetoggle{iftlseven}%用于处理biblatex3.7的兼容性
    \providetoggle{iftleight}%用于处理biblatex3.8到3.9的兼容性
    \providetoggle{iftlatest}%用于最新版biblatex,目前是biblatex3.10,20180117
    \StrBefore{\abx@version}{.}[\numinteger]%以点区分整数和小数
    \StrBehind{\abx@version}{.}[\numdigital]%小数部分可能带字母所以需将其去掉,见下一行代码
    \IfInteger{\numdigital}{}{\StrGobbleRight{\numdigital}{1}[\numdigital]}
    \togglefalse{iftlfive}
    \togglefalse{iftlsix}
    \togglefalse{iftlseven}
    \togglefalse{iftleight}
    \toggletrue{iftlatest}
    \ifnumcomp{\numinteger}{=}{3}{
        \ifnumcomp{\numdigital}{<}{10}{\ifnumcomp{\numdigital}{>}{7}{\toggletrue{iftleight}\togglefalse{iftlatest}}{}}{}%>3.8 版本用iftleight=true表示
        \ifnumcomp{\numdigital}{=}{7}{\toggletrue{iftlseven}\togglefalse{iftlatest}}{}%3.7 版本用iftlseven=true表示
        \ifnumcomp{\numdigital}{<}{7}{\ifnumcomp{\numdigital}{>}{2}{\toggletrue{iftlsix}\togglefalse{iftlatest}}{}}{}%3.3-3.6 版本用iftlsix=true表示
        \ifnumcomp{\numdigital}{<}{3}{\toggletrue{iftlfive}\togglefalse{iftlatest}}{}%3.0-3.2 版本用iftlfive=true表示
    }{\ifnumcomp{\numinteger}{>}{3}{
       \blx@warning@noline{%
       biblatex version is >= 4.x.\MessageBreak
       if errors raised,Please contact biblatex-gb7714-2015 pkg author.}%
    }{ \toggletrue{iftlfive}\togglefalse{iftlatest}%2.x版本统一用iftlfive=true表示
       \blx@warning@noline{%
       biblatex version is <= 2.x.\MessageBreak
       if errors raised,Please contact biblatex-gb7714-2015 pkg author.}%
    }}
    \newcommand\defversion[2]{\csdef{codeversion#1#2}}%定义不同版本的命令
    \newcommand\switchversion[2]{\csuse{codeversion#1#2}}%使用不同版本的命令

\defversion{3.0}{opt}{
    %biblatex3.3版前(比如texlive2015中的3.0版)的使用方式

    %增加姓名大小写格式处理选项
    \DeclareBibliographyOption{gbnamefmt}[uppercase]{%
        %\ifstrequal{##1}{gbuppercase}{}{}%
        \ifstrequal{##1}{lowercase}{\execgblowercase}{}%
        \ifstrequal{##1}{none}{\execnamedefault}{}
        \ifstrequal{##1}{pinyin}{\execnamepinyin}{}
    }
    %\ExecuteBibliographyOptions{gbnamefmt}

    %增加标签对齐选项,right是默认的右对齐,left是左对齐,gb7714-2015无效,仍然为右对齐模式,因为舍弃了list类环境后出错。
    \DeclareBibliographyOption{gbalign}[right]{%texlive2015中的3.0版中的DeclareBibliographyOption选项没有类型说明
        \ifstrequal{##1}{right}{}{}
        \ifstrequal{##1}{left}{\setalignleft}{}
        \ifstrequal{##1}{gb7714-2015}{}{}
    }

    %增加一个出版项自动处理控制选项,当true时使用出版者不详等信息补充缺失的出版信息。
    \newtoggle{bbx:gbpub}
    \DeclareBibliographyOption{gbpub}[true]{%
        %\settoggle{bbx:gbpub}{#1} %或采用下面这一句
        \ifstrequal{##1}{false}{\togglefalse{bbx:gbpub}}{\toggletrue{bbx:gbpub}}}
    \ExecuteBibliographyOptions{gbpub}

    %增加一个处理佚名或noauthor的控制选项
    %因为在顺序编码制中,不需要使用,这里也增加,为了与作者年制的兼容性考虑。
    \DeclareBibliographyOption{gbnoauthor}[true]{}%

    \ExecuteBibliographyOptions{
      sorting=none,
      useprefix=true,  %名字的信息包括前缀
      firstinits=true,    %名字有缩写,参考3.1.2.3 Internal
      %giveninits=true,
      date    = year,  %日期仅写到年
      maxnames     = 3 ,    %设置名字最大数量
      minnames     = 3       %设置缩减后的名字最小数量
      %uniquename   = init
    }
}

\defversion{3.4}{opt}{
    % Alter settings that carry through from biblatex
    %biblatex3.3版后(比如texlive2016中的3.4版)的使用方式

    %增加姓名大小写格式处理选项
    \DeclareBibliographyOption[string]{gbnamefmt}[uppercase]{%
        %\ifstrequal{##1}{gbuppercase}{}{}%
        \ifstrequal{##1}{lowercase}{\execgblowercase}{}%
        \ifstrequal{##1}{none}{\execnamedefault}{}
        \ifstrequal{##1}{pinyin}{\execnamepinyin}{}
    }
    %\ExecuteBibliographyOptions{gbnamefmt}

    %增加标签对齐选项,right是默认的右对齐,left是左对齐,gb7714-2015是项对齐方式
    \DeclareBibliographyOption[string]{gbalign}[right]{%
        \ifstrequal{##1}{left}{\setalignleft}{}
        \ifstrequal{##1}{gb7714-2015}{\setaligngbstyle}{}
    }

    %增加一个出版项自动处理控制选项,当true时使用出版者不详等信息补充缺失的出版信息。
    \newtoggle{bbx:gbpub}
    \DeclareBibliographyOption[boolean]{gbpub}[true]{%
        %\settoggle{bbx:gbpub}{#1} %或采用下面这一句
        \ifstrequal{##1}{false}{\togglefalse{bbx:gbpub}}{\toggletrue{bbx:gbpub}}}
    \ExecuteBibliographyOptions{gbpub}

    %增加一个处理佚名或noauthor的控制选项
    %因为在顺序编码制中,不需要使用,这里也增加,为了与作者年制的兼容性考虑。
    \DeclareBibliographyOption[boolean]{gbnoauthor}[true]{}%

    \ExecuteBibliographyOptions{
      sorting=none,
      useprefix=true,  %名字的信息包括前缀
      %firstinits=true,    %名字有缩写,参考3.1.2.3 Internal
      giveninits=true,
      date         = year,  %日期仅写到年
      maxnames     = 3 ,    %设置名字最大数量
      minnames     = 3       %设置缩减后的名字最小数量
      %uniquename   = init
    }
}

\defversion{3.7}{opt}{
    %biblatex3.7版后(比如texlive2017中的3.7版)的使用方式

    %增加姓名大小写格式处理选项
    \DeclareBibliographyOption[string]{gbnamefmt}[uppercase]{%
        %\ifstrequal{##1}{gbuppercase}{}{}%
        \ifstrequal{##1}{lowercase}{\execgblowercase}{}%
        \ifstrequal{##1}{none}{\execnamedefault}{}
        \ifstrequal{##1}{pinyin}{\execnamepinyin}{}
    }
    %\ExecuteBibliographyOptions{gbnamefmt}

    %增加标签对齐选项,right是默认的右对齐,left是左对齐,gb7714-2015是项对齐方式
    \DeclareBibliographyOption[string]{gbalign}[right]{%
        \ifstrequal{##1}{left}{\setalignleft}{}
        \ifstrequal{##1}{gb7714-2015}{\setaligngbstyle}{}
    }

    %增加一个出版项自动处理控制选项,当true时使用出版者不详等信息补充缺失的出版信息。
    \newtoggle{bbx:gbpub}
    \DeclareBibliographyOption[boolean]{gbpub}[true]{%
        %\settoggle{bbx:gbpub}{#1} %或采用下面这一句
        \ifstrequal{##1}{false}{\togglefalse{bbx:gbpub}}{\toggletrue{bbx:gbpub}}}
    \ExecuteBibliographyOptions{gbpub}

    %增加一个处理佚名或noauthor的控制选项
    %因为在顺序编码制中,不需要使用,这里也增加,为了与作者年制的兼容性考虑。
    \DeclareBibliographyOption[boolean]{gbnoauthor}[true]{}%

    \ExecuteBibliographyOptions{
      sorting=none,
      useprefix=true,  %名字的信息包括前缀
      %firstinits=true,    %名字有缩写,参考3.1.2.3 Internal
      giveninits=true,
      date         = year,  %日期仅写到年
      urldate =edtf, %iso8601
      eventdate =edtf,
      maxnames     = 3 ,    %设置名字最大数量
      minnames     = 3       %设置缩减后的名字最小数量
      %uniquename   = init
    }
}

\defversion{3.10}{opt}{
    %biblatex3.10版后的使用方式

    %增加姓名大小写格式处理选项
    \DeclareBibliographyOption[string]{gbnamefmt}[uppercase]{%
        %\ifstrequal{##1}{gbuppercase}{}{}%
        \ifstrequal{##1}{lowercase}{\execgblowercase}{}%
        \ifstrequal{##1}{none}{\execnamedefault}{}
        \ifstrequal{##1}{pinyin}{\execnamepinyin}{}
    }
    %\ExecuteBibliographyOptions{gbnamefmt}

    %增加标签对齐选项,right是默认的右对齐,left是左对齐,gb7714-2015是项对齐方式
    \DeclareBibliographyOption[string]{gbalign}[right]{%
        \ifstrequal{##1}{left}{\setalignleft}{}
        \ifstrequal{##1}{gb7714-2015}{\setaligngbstyle}{}
    }

    %增加一个出版项自动处理控制选项,当true时使用出版者不详等信息补充缺失的出版信息。
    \newtoggle{bbx:gbpub}
    \DeclareBibliographyOption[boolean]{gbpub}[true]{%
        %\settoggle{bbx:gbpub}{#1} %或采用下面这一句
        \ifstrequal{##1}{false}{\togglefalse{bbx:gbpub}}{\toggletrue{bbx:gbpub}}}
    \ExecuteBibliographyOptions{gbpub}

    %增加一个处理佚名或noauthor的控制选项
    %因为在顺序编码制中,不需要使用,这里也增加,为了与作者年制的兼容性考虑。
    \DeclareBibliographyOption[boolean]{gbnoauthor}[true]{}%

    \ExecuteBibliographyOptions{
      sorting=none,
      useprefix=true,  %名字的信息包括前缀
      %firstinits=true,    %名字有缩写,参考3.1.2.3 Internal
      giveninits=true,
      date         = year,  %日期仅写到年
      urldate =iso, %iso8601,edtf
      eventdate =iso,
      maxnames     = 3 ,    %设置名字最大数量
      minnames     = 3       %设置缩减后的名字最小数量
      %uniquename   = init
    }
}

\iftoggle{iftlfive}{\switchversion{3.0}{opt}}{}%biblatex<=3.2
\iftoggle{iftlsix}{\switchversion{3.4}{opt}}{}%3.3<=biblatex<=3.6
\iftoggle{iftlseven}{\switchversion{3.7}{opt}}{}%biblatex=3.7
\iftoggle{iftleight}{\switchversion{3.7}{opt}}{}%3.8<=biblatex<=3.9
\iftoggle{iftlatest}{\switchversion{3.10}{opt}}{}%biblatex最新3.10
  \end{texlist}

  \end{enumerate}



\subsection{脚注或旁注文献}
  标注命令自定义,在脚注中引用文献,或者把引文放在脚注中或者旁注中
  \begin{enumerate}
    \item 标注命令定义可以使用DeclareCiteCommand命令,设置上标,包围符号,标注前后内容等。针对GB/T7714-2015中关于引用标注的特殊要求,增加了一些方便实现要求的命令比如pagescite、yearpagescite等。
    \item 在footnote的脚注文本中使用footcite命令
    \item 在正文中使用footfullcite命令,见4.11.6 Mixing Programming Interfaces
  \end{enumerate}

\subsection{参考文献标题}
  参考文献标题修改并将标题加入目录中
  \begin{enumerate}
    \item 利用defbibheading\{bibliography\}[\textbackslash bibname]\{\}重定义标题
    \item 使用bibliography外的其它标题样式比如bibintoc等
    \item 利用titlesec等宏包进行修改标题样式,利用其局部性可以调整生成多种样式。注意: 利用titlesec后,直接在defbibheading\{bibliography\}[\textbackslash bibname]\{\} 中放置居中命令centering无效。
  \end{enumerate}


\subsection{其它需要说明的问题}
下面的问题想到哪写到哪,没有特别的顺序:

\begin{enumerate}
  \item 因为采用xelatex编译,所以样式文件直接采用UTF-8编码,没有考虑GBK 编码。

  \item \zhongdian{【Most Important】【注意】:当在顺序编码和作者年制的切换,或者biblatex版本切换时,如果使用出错,可先清理一下辅助文件,清理完后,重新编译即可。}

  \item 需要注意:当bibtex键中含有中文的时候,texlive2015中的biblatex3.0版的对参考文献条目的超链接会出现问题,而texlive2016中的biblatex3.4或以后的版本则没有问题。

  \item GB/T 7714-2015中的作者年制要求参考文献按文种集合,且中文在前英文在后。主要通过定义DeclareSortingScheme\{nyt\}(biblatex3.7 以前版本) 或DeclareSortingTemplate\{nyt\}(biblatex3.8以后版本),利用userb域排序实现。\bc{默认情况下,样式能基本正确的区分中文和英文文献并排序。当如果出现错误的情况,用户可以手动修改bib源文件,将userb 域设置成合适的字符串,用于排序,详见\ref{sec:usage:bbx}节的说明}。

%上一段2016-1114更新,下面这段是旧的说法,
%通过定义DeclareSortingScheme\{nyt\},设置方向为direction=descending,可以实现中文在前英文在后但两个文种的文献各自也是降序的。还有一种变通的方法是,在录入bib文件时,在userb域填入用于排序的信息,比如需要排前面中文文献填cn,排后面的英文文献用en。这样因为修改后的排序格式nyt会在author域前先用userb进行排序,自然会把中文文献放在前面。

  \item 关于出版地和出版者同时缺省的情况,GB/T 7714-2015中没有给出明确的说明,但英文给出了一个例子(见GB/T 7714-2015 附录A.3)而中文没有,英文的样式是[S.l. : s.n.],这种形式本样式文件中没有给出,而直接用两者分开的形式,[S.l.] : [s.n.],事实上这里作者认为没有必要把s.l.和s.n. 合起来,不仅与缺省两者之一的情况不统一,样式处理起来也增加不必要的麻烦。

  \item 目前符合GB/T7714-2005或GB/T7714-2015参考文献著录规则的biblatex 样式有好几个实现,除本样式外,还有李志奇(icetea)\footnote{\url{http://bbs.ctex.org/forum.php?mod=viewthread&tid=74474}} 和沈周(szsdk)\footnote{\url{http://bbs.ctex.org/forum.php?mod=viewthread&tid=152561&extra=page\%3D1}} 分别提供的样式文件,效果是类似的。此外,Casper Ti. Vector提供的biblatex 样式caspervector也是不错的中文参考文献样式
      \footnote{\url{https://gitlab.com/CasperVector/biblatex-caspervector}}。 感谢各位作者的分享!

  \item 本文档根据GB/T 7714-2015提供的参考文献表著录格式示例做了测试和验证,详见第\ref{sec:eg:gb77142015}节。测试系统环境为:
    \begin{itemize}
    \item windows7x86+texlive 2014,采用xelatex编译;

    \item windows7x64+texlive 2015,采用xelatex编译;

    \item 虚拟机xp+texlive 2016,采用xelatex编译;

    \item Deepin linux-x64v15.3+texlive 2016,采用xelatex编译。

    \item windows7x64+texlive 2017,采用xelatex编译;
    \end{itemize}

\end{enumerate}


\section{总结与致谢}

通过对 GB/T 7714-2015 标准的分析,对 biblatex 的学习和理解,在 biblatex 标准标准样式基础上,设计完成了符合 GB/T 7714-2015 标准的biblatex参考文献样式。从测试实践看,基本能够满足使用要求,用户可以放心使用。遇到问题时,除了可以查看
本文档说明外,也可以看样式文件代码,其中给出了详细注释,如果遇到无法解决的问题,请邮件联系作者。

%读者若查看样式文件内容可以看到作者对各目标要求所做的修改及,读者也可以根据自己的需求进行修改,作者设计样式文件的思路以及在设计过程中用到的一些biblatex宏包功能说明,详见第\ref{sec:biblatex:mech}节和LaTeX文档中文参考文献的biblatex解决方案的第2.7节。

最后要感谢如下各位师长和朋友,正是在各位的帮助建议下,本样式不断升级逐渐完善。包括: moewew(biblatex 现在的维护者之一,给了不少有益的建议)、 李志奇(基于biblatex的符合GBT7714-2005的中文文献生成工具作者,笔者以前使用该工具,其代码对于设计本样式很有启发)、LeoLiu(刘海洋,CJK字符判断函数
\footnote{\url{http://bbs.ctex.org/forum.php?mod=viewthread&tid=152663&extra=page\%3D3}} 对本宏包非常有帮助)、chinatex(china tex版主,给了很多建议和帮助,并且一起合作)、Sheng wenbo(biblatex用户手册合作译者,LaTeX2e 插图指南第三版译者,我们一起翻译的过程相互激励相互促进)、zepinglee(gbt7714-2015 bst样式作者,给了很多建议和讨论)、Harry Chen(ctex 维护者,给了不少好的建议)、liubenyuan(关于项目组织给出了很好的建议)、刘小涛(讨论了关于zotero的使用并提出了建议)、ghiclgi(讨论了GB中作者年制标注标签的一些问题)、秀文工作组、leipility、qingkuan、湘厦人、秋平、任蒲军、fredericky123、qiuzhu、chaoxiaosu、Old Jack、Wu Nailong、Yibai Zhang、wayne508、 钟乙源、Xiaodong Yao、dsycircle、rpjshu、zjsdut、谢澜涛、Zutian Luo、海阔天空、zzqzyx、程晨、xmtangjun、蔡伟 等等。当然还有更多这里没有列全的朋友们的热心帮忙,在此一并表示感谢!


\section{存在的问题和下一步工作}


\subsection{存在的问题}

\begin{enumerate}

  %\item 当作者多于3个需要添加等或et al.时,如果作者的姓名是用\{\}包起来的,可能判断会出错。
  %这个问题已经解决了,本来在\testCJKfirst中如果单靠edef加expandafter 组合,无法处理带编组的字符流。所以考虑利用xstring 宏包的\exploregroups函数来,提取字符到命令中,这一就能真正的获得域中的第一个字符,而不会把一个编组当成一个字符进行判断。2016-1223,详见修改历史1.0e中的说明。

  %\item 顺序年制中当不存在著者信息时,如果用佚名或者no author,本样式文件中没有实现。怎么在数据进来后,给一些域添加信息?在biber处理过程中根据一些判断添加信息?(著者年制,没有作者,用佚名,英文怎么办?没有年怎么办?)
  %这个问题解决了,2016-1114

  %\item 作者年制引用标签时,文中已经存在作者名的,标签只需要写年份,这个需要定义一个新的yearcite命令,是容易实现的,但这里没有实现。
  %这个问题解决了,2016-1114,增加了一个yearpagescite命令。

  %\item backref的格式也可以修改一下。
  %没有要求处理,但修改了,2016-1114,修改英文本地化字符串为引用页面。

  \item shorthand的问题没有遇到,其应用可能需要进一步理解。

  \item 当专著同时存在作者和编者的时候,GB/T 7714-2015没有明确的规定,所以目前样式文件中以biblatex标准样式的方式处理,这种处理因为与本地化相关,直接应用可能不好看的,也许需要修改。

  \item 因为GB/T 7714-2015中给出的了一些著录格式,如果把这些著录格式作为一个严格标准,那么条目中只能出现其中规定的域,而往往在bib文件中可能存在一些另外的信息比如chapter等,而且从标准样式修改的驱动中也仍然带有这些域的处理,如果为了标准化规范化考虑,可以去掉国标中没有提到的域的信息,可能使得内容更为标准,这可以通过修改增加数据模型,数据源动态修改,驱动修改(驱动中目前存在较多的似乎用不到的域,而且意义不是非常明确,这个等到biblatex说明文档中文版完成后再结合它全面的进行梳理)三条路子做到,需要的话,可以在下一步实现(2017-0226)。
\end{enumerate}

\subsection{下一步工作}

\begin{enumerate}
  \item 到1.0i版为止,除了基本功能需求外,进一步完善了: GB7714风格的文献表标签项对齐设计,编组内信息的中英文判断,特殊或老的bibtex 条目类型支持,改善空格设计以满足断行要求,支持了宏包选项(url等)应用,增加了宏包选项用于GB7714风格实现控制(gbpub 等),重新设计了版本兼容方式,以后的版本中将更容易兼容biblatex的升级。剩下的问题可能是一些文献具有特殊信息或者特殊情况时带来的适应性问题,这需要经过大量的测试来发现问题。各位朋友如果发现什么问题,请邮件联系,作者会非常感谢!

       %到1.0h版为止,进一步完善了样式宏包,该版本将是最后支持texlive2015的版本,以后版本的功能实现将基于最新texlive中biblatex 版本,而不再考虑texlive2015中3.0版的biblatex。

       %1.0g版增加对mastersthesis,phdthesis,www,electronic,standard,techreport,conference,newspaper等条目类型的兼容,增加了对标准样式standard.bbx中url包选项的兼容性,增加了析出文献标识符//后面的短空格以支持著录表的断行机制,增加了特殊字符处理功能并实现对texlive2015 的兼容,给出了gb7714风格参考文献著录表文本转换为bib文件的perl脚本,与gb7714-2015 样式形成闭环。

      %1.0f版完善了gbalign 选项(用于实现GB7714 风格的著录文献表标签,texlive2016 有效),带花括号的责任者的中英文判断等功能对texlive2015 的兼容性。

      %到1.0e版为止,功能需求已经完全实现,剩下的问题可能是一些文献具有特殊信息或者特殊情况时带来的适应性问题,这需要经过大量的测试来发现问题。各位朋友如果发现什么问题,请邮件联系,作者会非常感谢!

  \item biblatex宏包的说明文档中文版,已经由Shen wenbo和我基本完成,下一步是完善,校对,以及增加新版的内容。如果有朋友觉得这个事情有意义,愿意一起来完成这个事情,非常欢迎,请email联系。

  %\item 打算翻译biblatex宏包的说明文档和biber的说明文档,这个已经在进行中,完成了一部分,但因为只是业余时间做,可能最终完成的时间会比较长。如果有朋友觉得这个事情有意义,愿意一起来完成这个事情,非常欢迎,请email联系。

%\item 进一步完善上一节提到的问题。
\end{enumerate}

\section{更新历史}
\input{example/updatehistory.tex} %

\input{example/updatehistoryold.tex} %